アプリケーション/アクティビティが強制終了されたときにシステムがサービスを強制終了しないようにする方法
-
21-12-2019 - |
質問
アプリを持っています activity
そして1つ service
. 。私が殺したら activity
一方 service
実行していると殺されてしまいます。私にとっては、サービスが停止されないことが非常に重要です。システムが終了したとき(または「最近使用したアプリ」リストをクリアしてシステムを終了したとき)にそれを行う方法 activity
の service
ジョブが完了するまでアクティブなままですか?前もって感謝します!
解決
サービスが停止されないことが私にとって非常に重要です
プロセスは、ユーザーのアクティビティ (最近のタスク リスト、サードパーティのタスク マネージャー、設定の「強制停止」など) に基づいて、または OS のニーズ (システム RAM が少なくなってきている) に基づいて、理由を問わずいつでも強制終了できます。 )。これを防ぐことはできません。
OS が独自にプロセスの終了を決定する可能性を最小限に抑えるために、次のようないくつかの手順を実行できます。 startForeground()
ただし、これにより、ユーザーがアプリのプロセスで望むことを実行できなくなります。
そのサービスのウィンドウを表示しているので、サービスが停止するとウィンドウが消えます。
おそらくユーザーは、 望む ユーザーが最近のタスク リストやタスク マネージャーなどを介してアプリを明示的に削除すると、ウィンドウが消えます。これがもたらす悪影響について、ドキュメント内でユーザーにアドバイスすることは歓迎です。
そのサービスを別のプロセスに置くことを試してみることもできます。私の理解では、これは Android 4.4 の最近のタスク リストには役に立ちませんが、Android の以前のバージョンでは役立つかもしれません。これがサードパーティのタスク マネージャーで役立つかどうかはおそらくマネージャーに依存しますが、設定の「強制停止」では役に立たないはずです。また、IPC、メイン プロセスとサービス プロセスの両方が実行されている間のシステム RAM 消費量の増加などに対処する必要があることも意味します。
他のヒント
返品してみることもできます START_STICKY
から onStartCommand
サービス内:
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
handleCommand(intent);
// We want this service to continue running until it is explicitly
// stopped, so return sticky.
return START_STICKY;
}
バインドサービスを実行していますか?もしそうなら、最後のクライアントアクティビティが切断されたときにシステムはそれを殺す(終了)。これがリファレンスページ:
最後のクライアントがサービスからバインドされているとき、システムは破壊します サービス(StartService()によってサービスも開始されていない限り)