4

wake_lock必要がなくなったらすぐにを解放するのがベスト プラクティスであることはわかっていますが、たとえば、それを取得した や がロックを解放する前に終了または停止した場合はどうなりますかActivity? Serviceシステムによって自動的にリリースされますか? その場合、システムはそれらを自動的に解放する必要があると思いますが、APIドキュメントには何も見つかりません..

編集:詳細情報を追加

ドキュメントを見るPowerManager.WakeLockと、wake_locks がデフォルトで参照カウントされていることがわかりました (setReferenceCounted こちらを参照)。つまり、アクティビティでウェイク ロックを取得し、PowerManager.WakeLock wl = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "myWakeLock"); wl.acquire();それを保持する参照変数wlが範囲外になると、ウェイク ロックが参照カウントがゼロになったので解放されます...そうですか?

編集:上記の間違った理解

上記の参照カウントの概念を誤解していると思います...ロックを2回取得して1回だけ解放すると、参照カウントは1になり、ロックはまだ解放されていないことを意味するはずです。参照カウントされていない場合は、x 回取得でき、1 回のリリースで解放されます。

4

4 に答える 4

2

これについては、ネット上で多くの誤った情報が広まっているようです。Android API で公開されている WakeLocks はかなり複雑なライフサイクルを持っており、それを管理するには細心の注意を払う以外に方法はありません。

ウェイクロックを解放せずにアクティビティまたはサービスが停止した場合、状態は未定義です。コードを調べると ( https://android.googlesource.com/platform/frameworks/base/+/master/core/java/android/os/PowerManager.java、「class WakeLock」を検索)、それらが表示されます。それらはガベージコレクションされると解放されます。

ただし、これは「ガベージコレクションされるとき」というのは非常に緩いステートメントです。実際には、Lollipop より前のデバイスはウェイクロックの GC が非常に遅いようです (実用的な目的では、まったく発生していないふりをすることができます)。数秒。

参照カウントに関する質問については、Android コードで、カウントに関係なくロックが解除されることがわかります。

Android コードのせいにすると、何年にもわたってあまり変わっていないこともわかります。したがって、すべては GC の動作に帰着します。そのため、勤勉で、ロックをアクティビティ/サービスのフィールドに保存し、アプリのライフサイクルの適切な場所で解放/取得する必要があります。ただし、可能な限り、ウェイクロックを使用するのではなく、Gatekeeper が他の回答の 1 つにリンクしている Force Screen On トリックだけを使用する必要があります。

于 2015-08-07T07:15:40.457 に答える
1

プロセスが破棄された場合にのみ、ウェイクロックが解放されます。サービスを終了しただけでは / アクティビティwake_lockはリリースされません。

于 2012-08-26T15:28:51.787 に答える
0

この回答が飛躍的に役立つと信じていますForce Screen On

PowerManager API は、ウェイクロックをできるだけ早く解放する必要があると述べています。PowerManager API を使用すると、より多くのバッテリーが消耗することが知られています。また、そのAPIには次のように記載されています。

*部分的なウェイクロックを保持している場合、タイマーに関係なく、ユーザーが電源ボタンを押した後でも、CPU は実行を続けます。他のすべてのウェイクロックでは、CPU は実行されますが、ユーザーは電源ボタンを使用してデバイスをスリープ状態にすることができます。

http://developer.android.com/reference/android/os/PowerManager.html

于 2012-08-26T15:29:35.287 に答える