为什么Application有时会在killProcess上重启?

时间:2012-07-30 16:57:26

标签: android android-activity activity-lifecycle android-windowmanager

通常,请致电:

退出我的申请表
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操作系统的设计,killProcess()不是终止应用程序的正确方法。这是因为killProcess()停止了进程immediately,而没有给予应用程序阻止或准备它的任何方式或机会。

我知道当我调用finish()时,应用程序堆栈只是被推到后台(并且仍然存在于内存中)。 Android本身决定何时关闭应用程序(即从存储器中删除其实例),并且通常在应用程序变为“最长时间未使用的最长时间”时完成。如果它真的是last one,那么它的行为实际上更容易预测。

问题是finish()仅停止并销毁调用它的活动。它不会阻止应用程序或其他活动产生的其他活动。因此,为了便于测试和在开发期间调试,我使用killProcess()作为方便的快捷方式。

但是现在我发现这有副作用有时在自杀后立即重启 - 所有在30毫秒内

一个简单的解决方案是遍历所有应用程序的活动并finish()。但在继续这一过程之前,我很想理解Android操作系统中的 使应用程序自行复活。

为什么 Android会导致应用程序重启?

为什么不一致? (即有时

4 个答案:

答案 0 :(得分: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

答案 1 :(得分:2)

您的应用是在单个进程中运行还是多个进程? killProcess会杀死一个进程,不一定是整个应用程序。请尝试使用ActivityManager#killBackgroundProcesses(String packageName)

如果这不起作用,看起来这些links可能是helpful来解释系统在进程被杀死时的行为。

顺便说一句,Android系统正在重新启动你的应用程序......为了开发目的,可以操纵它的行为(即通过阻止应用程序重新强制关闭),但你不应该这样做将您的应用推向生产。

答案 2 :(得分:1)

ADT 17.0.0开始,有一个静态字段BuildConfig.DEBUG可以帮助您进行调试。例如,您可以拥有一个包含所有正在运行的活动实例的静态类。然后你可以一次完成所有这些。我认为它比killProcess() ...

更好

答案 3 :(得分:0)

请按照您对问题的预期答案的链接进行操作。 android.os.Process.killProcess(pid) did restart the processes again