0

BroadcastReceivers複数に応答する(マニフェストではなくコードで作成された)長期実行サービスがあります。ほとんどの場合、サービスは正常に実行されていますが、ときどきサービスが停止します(動作がBroadcastReceivers停止します)-システムが何らかの理由でサービスを一時停止していると思います(デバイスで実行中のプロセスを調べると、サービスがはっきりとわかりますまだ「実行中」です)。

サービスが一時停止されている正しい理由はわかりませんが、このような場合にonDestroy()メソッドが呼び出されるのか、それとも何らかの方法でこれを処理する機会があるのか​​を知りたいのですが。

onDestroy()サービスは[実行中のプロセス]タブにまだ表示されているため、呼び出されていないと思います。また、サービスにフラグを返してもらうSTART_STICKYので、メモリ上の理由で強制終了されるたびにシステムがフラグを再起動する必要があります。また、なんらかの形で「一時停止」した場合WakeLock、これが発生しないようにすることはできますか?

最善の解決策は、すべてをマニフェストに入れて、それらのメソッドBroadcastReceiversから呼び出されるワンショットサービスを作成することであることを知っています。onReceive()ただし、初期化段階は非常に集中的であるため、長期実行サービスの方法を選択しました。すべてを一度だけ初期化する方がよいためです。

4

1 に答える 1

0

onDestroy()は、リソースの不足によってサービスが強制終了された場合、または明示的に停止した場合にのみ呼び出されます。

CPUが停止するため、電話機がアイドル状態になったとき(通常は画面がオフのとき)にサービスを「一時停止」することができます。サービスを常に実行するには、PowerManager.PARTIAL_WAKE_LOCKを使用する必要がありますが、CPUを停止せず、バッテリーを消耗しないため、賢明に使用してください。アプリを常に実行したままにしないでください。WakeLockを保持して必要なことを実行し、それを解放するだけです。

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

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

AlarmManagerを使用して、アプリを定期的に「ウェイクアップ」し、何かを実行できます。

http://developer.android.com/reference/android/app/AlarmManager.html

于 2013-02-07T11:06:32.140 に答える