2014-11-04 101 views
8

我正在开发一个Android应用程序,正如预期的那样,有些情况下我的代码崩溃了(bug,空指针等)。当应用程序崩溃时会发生什么?

当应用程序崩溃时,它会重新启动自身,即使我没有编写任何代码来执行它(我想这是默认行为?!),但问题是,应用程序以不正确的状态打开。

这里是当应用程序启动时什么一般情况:

  • 最初,该应用程序带有“闪屏”打开。该屏幕尝试使用共享首选项中的持久性令牌对用户进行身份验证,并从服务器加载一些默认值并将其保留在某些服务中。
  • 根据登录成功,它会转到主屏幕或登录屏幕。

当应用程序正常启动,这一切工作正常,并如预期的那样执行初始化序列但是当它重新启动作为碰撞的结果,将已经填充在启动画面片段中的值(例如作为登录用户或从服务器加载默认值)都是无效的,这意味着它们从不执行。

这使我相信,应用程序重新启动时的事件序列是完全错误的,即不是使用正确的活动重新启动应用程序,而是在清单中指定为启动器,它似乎会错误地重新启动事物并从错误的活动。

所以,这里的问题是:什么决定了我的应用程序应该在发生崩溃时自行重启,以及决定应该如何启动?当应用程序从崩溃中启动时,是否有任何事件可以捕获,以便我可以覆盖初始化序列?有没有办法强制应用始终从启动器活动开始?

提前许多感谢,

+1

只是添加一些信息,你可以通过调用:android.os.Process.killProcess(android.os.Process.myPid())来防止再次打开应用程序。 System.exit(0) 在全局Thread.UncaughtExceptionHanlder中。我不知道这是多么正确(可能不多)。但我真的很想知道应用程序在这些场景中应该如何表现 – JML 2014-11-04 19:32:25

+0

非常感谢JML。这确实有帮助;不过,我应该提及,我并不特别介意重新启动应用程序,我希望尽可能保持与Android生态系统的“标准方式”接近,这似乎是操作系统自动重新启动应用程序。然而,我希望它在通过尊重启动器标志重新启动时运行正确,或者至少让我能够覆盖初始化序列。再次,非常感谢您的建议。 – kha 2014-11-04 19:36:09

回答

2

当活动重新启动时,由于碰撞,如果运行前台活动的过程中消失了,系统会扔掉的活动,如果没有一个有效的保存状态(通常意味着它已暂停,并且已从系统暂停之前将系统onSaveInstanceState的结果)。一旦系统决定是否放弃该活动,它将恢复现在堆叠顶部的任何活动。如果这是你的活动之一,或者因为你有另一个坠毁的人,或者坠毁的人是某种稳定的暂停状态,那么系统会再次启动你的过程以显示最高的活动。您可以尝试在AndroidManifest主要活动(启动器活动)声明中设置clearTaskOnLaunch="true",并在除主设备之外的其他活动中设置android:finishOnTaskLaunch ="true",然后查看是否会阻止应用程序在崩溃后的其他状态下重新启动。另一种方法是检查您的活动重新启动的位置,然后在起点检查此活动是否具有所有需要的数据。如果它没有全部所需的数据,则重定向到启动器活动。希望这可以帮助。

+0

谢谢你的解释。我尝试了clearTaskOnLaunch方法,但对我不好。虽然应用程序确实会在发生崩溃时进入启动器活动,但作为更改的结果,它也会在恢复时进入启动器活动(将应用程序最小化 - >转到应用程序现在将我带到登录屏幕,而不是我想要)。第二种方法存在的问题是有超过20种不同的活动,其中一些嵌套深度较深。如果他们有他们所需要的,那么在起点检查所有这些将非常麻烦,但如果没有其他选择,我必须这样做。 – kha 2014-11-05 07:58:43

相关问题