11

通常、次のように呼び出してアプリケーションを終了します。

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 が強制終了されたアプリケーションを再起動するのはなぜですか?

そして、なぜ一貫性がないのですか?(つまり時々 )

4

4 に答える 4

4

インストーラー、Web ブラウザー、および IDE (IntelliJ、Eclipse など) から初めてアプリケーションを起動する方法には、既知のバグがあります。アプリを起動せずにインストールしから、使用可能なアプリケーションのリストから起動して、問題が解決するかどうかを確認してください。問題に関連してずっと前に提出されたこれらの問題を参照してください。

http://code.google.com/p/android/issues/detail?id=2373

http://code.google.com/p/android/issues/detail?id=26658

于 2012-08-03T07:37:11.213 に答える
2

アプリは単一のプロセスで実行されていますか、それとも複数のプロセスで実行されていますか? killProcess必ずしもアプリケーション全体ではなく、単一のプロセスを強制終了します。ActivityManager#killBackgroundProcesses(String packageName)代わりに使用してみてください。

それでもうまくいかない場合は、これらのリンクが、プロセスが強制終了されたときのシステムの動作を説明するのに役立つようです。

ところで、Android システムはアプリケーションを再起動しているものです...開発目的でその動作を操作すること (つまり、強制終了時にアプリが再起動しないようにすること) は問題ありませんが、アプリをプッシュするときにこれを行うべきではありません生産へ。

于 2012-07-30T17:44:55.720 に答える
1

ADT 17.0.0から、BuildConfig.DEBUGデバッグに役立つ静的フィールドがあります。たとえば、実行中のアクティビティのすべてのインスタンスを保持する静的クラスを持つことができます。その後、一度にすべてを完了することができます。killProcess()…</p> よりはましだと思います

于 2012-07-30T18:09:28.013 に答える
0

あなたの質問の予想される答えがあるリンクをたどってください。 android.os.Process.killProcess(pid) はプロセスを再起動しました

于 2014-04-24T09:34:24.110 に答える