通常,通过调用退出我的应用程序:
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毫秒内完成 。
一个简单的解决方案是迭代所有应用程序的活动并完成它们。 但在继续这一过程之前,我很想知道Android OS中的应用程序是什么让应用程序自我复活。
为什么 Android会重启被杀死的应用程序?
为什么不一致? (即有时 )
第一次从安装程序,Web浏览器和IDE(IntelliJ,Eclipse等)启动应用程序的方式存在一个已知错误 。 请尝试安装您的应用程序而不启动它 ,然后从可用应用程序列表中启动它 ,看看问题是否消失。 请参阅很久以前提出的与此问题相关的问题:
您的应用是在单个进程中运行还是多个进程? killProcess将killProcess一个进程,不一定是整个应用程序。 尝试使用ActivityManager#killBackgroundProcesses(String packageName) 。
如果这不起作用,看起来这些链接可能有助于解释系统在进程被终止时的行为。
顺便说一句,Android系统正在重新启动你的应用程序……为了开发目的,可以操纵它的行为(即阻止应用程序强制关闭时重启),但推送应用程序时不应该这样做生产。
从ADT 17.0.0开始 ,有一个静态字段BuildConfig.DEBUG可以帮助您进行调试。 例如,您可以拥有一个包含所有正在运行的活动实例的静态类。 然后你可以一次完成所有这些。 我认为它比killProcess()更好……
请按照您的问题的预期答案链接。 android.os.Process.killProcess(pid)再次重启了进程