7

2D バーコードをスキャンし、各バーコードをより長いタスクが実行される IntentService に送信する小さなユーティリティ アプリを開発しています。

アクティビティが表示されると、バーコードがサービスで処理されるまで、デバイスがスリープ状態にならないようにする必要があります。サービスが処理を終了するとサービスは停止しますが、アクティビティは引き続き表示されます。

アクティビティのライフサイクル中に SCREEN_DIM_WAKE_LOCK WakeLock を保持したいのですが、このタイプは CPU のスリープを妨げないため、新しい 2D コードがスキャンされたときにアクティビティで PARTIAL_WAKE_LOCK を取得して解放する必要もあります。処理後のインテント サービスで。

SCREEN_DIM_WAKE_LOCK の目的は、ユーザーが数秒ごとに電源ボタンを押してデバイスを起動し、新しいバーコードを読み取れるようにするという不便さを回避することです。ユーザーは大量のコードを次々に読み取る必要があり、ユーザーの操作がない短い間隔であっても、アクティビティは継続する必要があります。

Android では、アプリが制御できないいくつかの条件のために、アプリが一番上にある、閉じられていない、またはフォアグラウンドにあるという 100% の保証がないことを知っていますが、できる限り行きたいと思います。

複数の WakeLock を保持することは可能ですか? アクティビティとサービスの両方からアクセスできることをどこで宣言できますか? (シングルトン、拡張アプリケーション?)

4

1 に答える 1

10

複数の WakeLock を保持することが可能です。実際、画面がオフのときに複数のアプリケーションが同時に同期すると、常に行われます。(画面がロックされているときに、GMail アプリと Facebook アプリが同時に同期することを想像してください。それらは、お互いに異なる WakeLock を持っていることを知りません。異なるタイプの WakeLock である場合とそうでない場合があります)。

Android は、すべてのユーザーの期待に確実に応えます (つまり、バッテリーの消耗を最大限に抑えます)。

私の意見では、SCREEN_DIM_WAKE_LOCK が必要であるという事実を考えすぎていると思いますが、これは誤って大量のバッテリーを消耗させる可能性があるためですが、ユースケースによっては間違っている可能性があります。

したがって、短い答えはYESです。複数の WakeLock を保持でき、Android は期待どおりに動作します (はずです)。留意すべき唯一のことは、両方のウェイクロックを適切に解放することです。

画面の上に乗る問題では、アクティビティが一時停止状態になったときに (何らかの理由で別のアクティビティが上にある場合、または意図的に電源ボタンを押した場合)、アクティビティの WakeLock を解放する必要があると思います。この時点で、ユーザーは別のアプリと対話しているため、それを尊重し、独自の動作を制御できるようにする必要があります。完了するまで、サービスからの部分的な wake lock をあきらめる必要はありません。

お役に立てれば。

于 2012-09-18T11:17:05.157 に答える