アンドロイド:ウェイクロックとハンドリング方向の変更
-
20-09-2019 - |
質問
アプリが表示されているときに携帯電話がスリープしないように、アプリケーションで Wakelock を使用しています。
問題は、向きが変更され、システムがアプリを破棄し、横向きモードで再作成した場合に発生します。バックグラウンドでウェイクロック タイマーが期限切れになった場合、システムはウェイクロックの解放を機会として画面をオフにします。
編集:私が理解しているように、Wakelock onResume を設定し、onPause を解放していることは言及しておく必要があります。アプリが wakelock を漏らすのを防ぐために、解放する必要があります。
向きの変更を続行するにはウェイクロックが必要です。
以下にこれに対する解決策を概説しました。これはそれを処理する好ましい方法でしょうか?また、代替手段はありますか?
(アクティビティではなく) wakelock を保持するサービスを作成し、アクティビティがバインドを解除すると、サービスはカウントダウン タイマー (たとえば 10 秒) を開始し、アクティビティが再バインドされない場合にタイマーが期限切れになると、wakelock を解放します。単純な向きの変更の場合、アクティビティは 10 秒以内に再バインドされるためウェイクロックが維持されますが、そうでない場合はウェイクロックが解放されます。
ありがとう。
解決
WakeLock
の、getWindow().setFlags()
フラグを使用してWindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON
を試してみます。
wakelockタイマーがで有効期限が切れている場合 システムがとる背景 機会としてwakelockのリリース 画面をオフにする。
これはいけません。定義では、ユーザーがデバイスと相互作用したので、画面は他の何かに依存しないことの理由のために滞在する必要があります。
他のヒント
ここで私はそれをやった方法です...
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」フラグは、ユーザアクティビティタイマーをつつく。
私にとってはOK作品!
実際にはウェイクロックを決して解放しないことでそれを実現しました。代わりに、タイムアウトで取得します。
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() などをいじる必要はありません)
- 向きの変更後にユーザーのアクティビティを突き刺しません。つまり、薄暗くなったディスプレイは薄暗くなったままになります
- リリースした場合 (例:時間が経過してもユーザーがアクティビティに残った場合、すぐに解放されます。デフォルトのタイムアウトを待つ必要はありません。