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

问题描述:

通常情况下,通过调用退出我的应用程序:为什么应用程序有时会在killProcess上重新启动?

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 [email protected] 
.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 OS中的使应用程序自身恢复。

为什么会的Android做一个被杀重新启动应用程序?

为什么不一致? (即有时为

+0

您的广播接收机已经在Manifest中注册了意向过滤器吗?这会导致你的应用程序启动。 – 2017-10-18 20:51:56

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

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

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

+1

顺便说一下,即使从安装程序或Eclipse第一次运行,该应用程序有时也会**重新启动。它不会始终在这些调用上重新启动。 – ef2011 2012-08-03 19:53:52

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

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

顺便说一下,Android系统是什么重新启动您的应用程序...它是好的操纵其行为(即通过阻止应用程序强制关闭重新启动)用于开发目的,但你不应该这样做时你推动你的应用程序生产。

+0

哇。感谢您宝贵的提示。我一直以为我在一个过程中运行,但让我仔细检查一下。我会更新,因为我有更多的发现。 – ef2011 2012-07-30 19:13:08

+0

好的,我仔细检查过,我只在一个过程中运行。但是,我会调用在其他过程中运行的活动(例如Google地图),这是否值得?我倾向于接受你的回答,因为它包含与我的案例非常相似的链接,其中的信息可以解释我的案例中发生的事情。但我会稍等一下,看看是否有人能够提出更明确的解释(我怀疑这会发生)。谢谢! – ef2011 2012-07-30 19:33:51

+0

**更新:**我刚刚遇到另一个这样的重新启动事件,现在我有几个更多的日志调用,我可以告诉你:** 1。**它总是发生在全新的安装(即应用程序首先通过应用程序设置手动卸载,然后通过“运行>运行(Ctrl + F11)”运行。** 2。**重新启动会创建应用程序的新实例('Activity.getApplication()。toString()')。这肯定不是同一个应用程序返回到堆栈的前端,我可以从中学到什么? – ef2011 2012-08-01 20:00:48

ADT 17.0.0,有一个静态字段BuildConfig.DEBUG,它将帮助您进行调试。例如,你可以有一个静态类,它保存所有运行活动的实例。然后,您可以一次完成所有内容。我认为这是比killProcess()更好...

+0

伟大的提示。谢谢。加上upvote。 – ef2011 2012-07-30 19:11:21

+0

我很高兴这很有用。不客气:-) – 2012-07-30 19:13:10

请遵守它有你的问题的预期的答案的链接。 android.os.Process.killProcess(pid) did restart the processes again