2

アプリが表示されているときに電話がスリープ状態にならないように、アプリケーションで Wakelock を使用しています。

問題は、向きの変更があり、システムが横向きモードでアプリを破棄して再作成するときに発生します。ウェイクロック タイマーがバックグラウンドで期限切れになった場合、システムはウェイクロックのリリースを画面をオフにする機会と見なします。

編集: Wakelock onResume を設定し、onPause を解放していることに言及する必要があります。私が理解しているように、アプリがウェイクロックをリークするのを防ぐために解放する必要があります。

向きの変更を続行するには、ウェイクロックが必要です。

以下に、これに対する解決策を概説しました。これはそれを処理するための好ましい方法ですか?代替手段はありますか?


(アクティビティではなく) ウェイクロックを保持するサービスを作成し、アクティビティがバインドを解除すると、サービスはカウントダウン タイマー (たとえば 10 秒間) を開始します。単純な向きの変更の場合、アクティビティはその 10 秒以内に再バインドされるため、ウェイクロックが維持されます。そうでない場合は、ウェイクロックが解放されます。

ありがとう。

4

3 に答える 3

4

の代わりに、フラグを使用してWakeLockみてください。getWindow().setFlags()WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON

ウェイクロック タイマーがバックグラウンドで期限切れになった場合、システムはウェイクロックのリリースを画面をオフにする機会と見なします。

すべきではありません。定義上、ユーザーはデバイスと対話したため、画面は他の理由に関係なく、その理由でオンのままにする必要があります。

于 2010-01-13T17:27:16.590 に答える
0

これが私がやった方法です...

PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE);
wl = pm.newWakeLock(PowerManager.FULL_WAKE_LOCK|PowerManager.ON_AFTER_RELEASE, "DoNotDimScreen");

に続く...

wl.acquire();

...実際にウェイクロックを有効にする必要がある場合。

「PowerManager.ON_AFTER_RELEASE」フラグはユーザー アクティビティ タイマーをポークするため、このウェイクロックが解放されたときに画面が少し長く表示されたままになります。これは、方向の変更でアクティビティが破棄された場合に当てはまります。

私にとってはうまくいきます!

于 2014-02-05T00:20:56.750 に答える
0

実際にはウェイクロックを決して解放しないことでそれを行いました。代わりに、タイムアウトで取得します。

private PowerManager.WakeLock wl;

protected void onStart(Bundle savedInstanceState) {
    PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE);
    wl = pm.newWakeLock(PowerManager.SCREEN_DIM_WAKE_LOCK, "Words counter");
    // disable reference counting, as acquire/release calls are not paired
    wl.setReferenceCounted(false);
    wl.acquire();
}

protected void onStop() {
    // acquire for few seconds to keep lock until onStart is called with new orietnation
    wl.acquire(3000);
}

他の方法に対する利点:

  • で使用可能SCREEN_DIM_WAKE_LOCK
  • シンプル (isFinishing() などで遊ぶ必要はありません)
  • 向きの変更後にユーザー アクティビティを突かない。つまり、薄暗いディスプレイは薄暗いままです
  • リリースした場合 (例: 時間は過ぎたが、ユーザーがアクティビティにとどまった場合)、すぐにリリースされます。デフォルトのタイムアウトを待つ必要はありません。
于 2014-06-30T10:24:12.047 に答える