为什么应用程序有时会重新启动killProcess?

通常,通过拨打我的应用程序退出:

android.os.Process.killProcess(android.os.Process.myPid()); 

performance不错。

但每过一段时间,应用程序将重新启动(退出后!)。

相关的日志片段显示:

 .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的devise, killProcess()不是终止应用程序的正确方法。 这是因为killProcess()会 立即停止进程,而不会给应用程序以任何方式或机会来阻止或准备进程。

我知道当我调用finish()时 ,应用程序堆栈只是被推到后台(并且仍然存在于内存中)。 Android本身决定何时closures应用程序(即从内存中删除它的实例),通常这是在应用程序变成“最久不用的时间最长”的时候完成的。 它的行为实际上是更可预测的,如果它真的是最后一个 。

问题是finish()只会停止并破坏被调用的活动。 它不会阻止应用程序或其他活动产生的其他活动。 所以,为了便于开发过程中的testing和debugging,我使用killProcess()作为一个方便的捷径。

但是现在我看到,这有一个应用程序的副作用, 有时会在自杀后立即重新启动 – 所有这些都在30毫秒内完成

一个简单的解决scheme是迭代所有应用程序的活动并完成()它们。 但在继续这个之前,我很想了解Android OS中的应用程序是如何使应用程序自我复原的。

为什么 Android会使应用程序重新启动?

为什么不一致? (即有时

从安装程序,Web浏览器和IDE(IntelliJ,Eclipse等)第一次开始应用程序的方式有一个已知的错误 。 请尝试安装您的应用程序而不启动它 ,然后从可用应用程序列表中启动它,并查看问题是否消失。 看到很久以前提出的有关这个问题的这些问题:

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

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

您的应用程序是在单个进程中运行吗? killProcess将杀死一个进程,不一定是你的整个应用程序。 尝试使用ActivityManager#killBackgroundProcesses(String packageName)来代替。

如果这不起作用,看起来这些链接可能有助于解释当进程被终止时系统的行为。

顺便说一句,Android系统是什么重新启动您的应用程序…它可以操纵其行为(即通过阻止应用程序强制closures重新启动)用于开发的目的,但你不应该这样做,当你推动你的应用程序到生产。

从ADT 17.0.0开始 ,有一个静态的BuildConfig.DEBUG字段可以帮助您进行debugging。 例如,你可以有一个静态类,它包含所有正在运行的活动的实例。 那么你可以一次完成所有的事情。 我认为它比killProcess()更好…

请按照它有您的问题的预期答案的链接。 android.os.Process.killProcess(PID)确实再次重新启动进程