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 操作系统的设计,killProcess()不是终止应用程序的正确方法。这是因为killProcess()立即停止该进程,而没有给应用程序任何方式或机会来阻止它或为它做准备。

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

问题是finish()只会停止并破坏它被调用的活动。它不会停止应用程序或其他活动产生的其他活动。因此,为了便于在开发过程中进行测试和调试,我使用 killProcess()作为一种方便的快捷方式。

但现在我看到这有应用程序有时会在杀死自己后立即重新启动的副作用——所有这些都在 30 毫秒内

一个简单的解决方案是遍历所有应用程序的活动并完成()它们。但在继续此之前,我很想了解Android 操作系统中是什么让应用程序自己复活。

为什么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 回答