通常、次のように呼び出してアプリケーションを終了します。
android.os.Process.killProcess(android.os.Process.myPid());
何事もなくうまくいく。
しかし、時々、アプリケーションは (終了後に) 再起動します。
関連するログ スニペットは次を示しています。
.631: I/Process(15495): Sending signal. PID: 15495 SIG: 9
.641: W/AudioFlinger(121): write blocked for 252 msecs, 1279 delayed writes, thread 0xdc18
.651: I/ActivityManager(164): Process com.ef.myapp (pid 15495) has died.
.651: I/WindowManager(164): WIN DEATH: Window{463659e8 com.ef.myapp/com.ef.myapp.MainActivity paused=false}
.661: I/AudioService(164): AudioFocus abandonAudioFocus() from android.media.AudioManager@460b2b98
.701: I/ActivityManager(164): Start proc com.ef.myapp for activity com.ef.myapp/.MainActivity: pid=15589 uid=10077 gids={3003}
Android OS の設計上、killProcess()がアプリケーションを終了する適切な方法ではないことはわかっています。これは、killProcess()が、アプリがプロセスを防止したり準備したりする方法や機会を与えずに、プロセスをすぐに停止するためです。
finish()を呼び出すと、アプリケーション スタックがバックグラウンドにプッシュされる (そしてメモリ内にまだ存在する) ことがわかっています。Android 自体がいつアプリケーションを閉じるか (つまり、メモリからインスタンスを削除するか) を決定します。一般に、これは、アプリケーションが「最も長く使用されていない最も古いもの」になったときに行われます。それが本当に最後のものである場合、その動作は実際にはより予測可能です。
問題は、finish()が呼び出されたアクティビティのみを停止して破棄することです。アプリケーションまたは他のアクティビティによって生成された他のアクティビティは停止しません。そのため、開発中のテストとデバッグを容易にするために 、便利なショートカットとしてkillProcess()を使用しています。
しかし今では、アプリケーションが自分自身を強制終了した直後に再起動するという副作用があることがわかりました。すべて30 ミリ秒以内です。
簡単な解決策は、すべてのアプリケーションのアクティビティを繰り返し処理し、finish()することです。しかし、これに進む前に、Android OS の何がアプリケーションを復活させるのかを理解したいと思っています。
Android が強制終了されたアプリケーションを再起動するのはなぜですか?
そして、なぜ一貫性がないのですか?(つまり時々 )