应用程序崩溃时会发生什么?

9
我正在开发一个Android应用程序,正如预期的那样,我的代码会出现崩溃(错误,空指针等)的情况。
当应用程序崩溃时,它会重新启动自己,尽管我没有编写任何代码来执行此操作(我想这是默认行为?!),但问题是,应用程序在不正确的状态下打开。
以下是应用程序启动时通常发生的情况:
- 最初,应用程序带有“启动屏幕”。该屏幕尝试使用共享首选项中持久化令牌进行用户身份验证,并从服务器加载一些默认值并将它们保留在一些服务中。 - 根据登录成功与否,它要么转到主屏幕,要么转到登录屏幕。
当应用程序正常启动时,所有内容都可以正常工作,并按预期执行初始化序列。 但是,当由于崩溃而重新启动时,应用程序中的启动屏幕片段中将填充的值(如登录用户或从服务器加载默认值)全部无效,这意味着它们永远不能被执行。
这使我相信,当应用程序重新启动时,事件序列完全错误,即它似乎错误地重新启动了应用程序,并从错误的活动开始启动。
因此,这里的问题是:是什么确定了我的应用程序在崩溃时应该重新启动,以及如何确定它的启动方式?是否有任何事件可以捕获,以便我可以覆盖初始化序列?是否有一种方法可以强制应用程序始终从启动器活动开始启动?
非常感谢您的帮助。

1
只是补充一些信息,您可以通过调用以下代码来防止应用再次打开: android.os.Process.killProcess(android.os.Process.myPid()); System.exit(0) 在全局Thread.UncaughtExceptionHanlder中。我不知道这是否正确(可能不太正确)。但我真的很想知道应用程序在这些情况下应该如何行为。 - JML
非常感谢JML。这确实很有帮助;但是,我应该提到,我并不特别介意应用程序重新启动,而且我理想情况下希望尽可能接近Android生态系统的“标准方式”,即由操作系统自动重新启动应用程序。然而,当它被重新启动时,我希望它能正确地行为,遵守Launcher标志或至少给我覆盖初始化序列的手段。再次感谢您的建议。 - kha
1个回答

4

当一个活动由于崩溃而重新启动时,如果运行前台活动的进程消失了,并且该活动没有有效的保存状态(通常意味着它已暂停并从暂停之前给系统 onSaveInstanceState 的结果),系统将放弃该活动。一旦系统决定是否放弃该活动,它将恢复当前堆栈顶部的任何活动。如果其中一个是您的活动,这是因为您在崩溃的活动后面有另一个活动,或者崩溃的活动以某种方式处于已解决的暂停状态,那么系统将重新启动您的进程以显示该顶部活动。您可以尝试在 AndroidManifest 主活动(启动器活动)声明中设置 clearTaskOnLaunch="true",并在除主活动外的其他活动中设置 android:finishOnTaskLaunch ="true",看看这是否可以防止应用在崩溃后重新启动到其他状态。另一种方法是检查您的活动何时重新启动,然后检查起始点,确定该活动是否具有所有必需的数据。如果它没有所有必需的数据,则重定向到启动器活动。希望这有所帮助。


谢谢你的解释。我尝试了clearTaskOnLaunch方法,但对我来说不好用。虽然应用程序确实在崩溃时转到启动器活动,但由于更改的结果,当它恢复时也会转到那里(最小化应用程序->转到应用程序现在将带我到登录屏幕,这不是我想要的)。第二种方法的问题是有超过20个不同的活动,有些嵌套几层深。如果没有其他选择,检查它们所有的起点是否都有他们需要的东西将非常麻烦,但我必须这样做。 - kha

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接