首页 > 解决方案 > 在 Android ANR 对话框中按“关闭应用程序”,关闭并立即重新启动应用程序

问题描述

我正面临一个奇怪的(在我看来)问题。我的应用很少产生ANR。我试图尽可能减少它们,到目前为止我已经成功了。但是,当 ANR 对话框确实出现时,如果我(或任何用户)决定通过按“关闭应用程序”而不是等待它做出响应来关闭应用程序,那么应用程序会关闭但会立即重新启动并显示与它相同的活动在显示 ANR 对话框时执行此操作。

这很麻烦,因为当用户正常启动我的应用程序时,他/她会经历一系列活动,每个活动负责执行一些任务,创建一些对象等。然而,当应用程序自动重新启动并且用户发现自己处于与显示 ANR 对话框时相同的活动,这一系列活动尚未发生,因此缺少某些所需的东西,因此我的应用程序崩溃了。可能是一个对象为空,一个 int 的值不正确,某些字符串可能为空等。确切的问题在这里并不重要重要的是应用程序没有完成用户打开时通常执行的一系列活动,设置所有这些对象、变量等,这些对象、变量等在到达此活动之前将需要。

另一方面,如果我的应用程序在任何时候崩溃,我会有一个 UncaughtExceptionHandler 以“干净的方式”关闭我的应用程序。相当于用户按下“概览”按钮,然后通过按下“x”或向左/向右滑动来关闭应用程序。因此,如果用户想再次使用该应用程序,他/她将再次启动它,该应用程序将执行它应该执行的一系列活动,并且一切都按预期工作。但是,当出现 ANR 对话框时,我无法控制按下“关闭应用程序”实际上做了什么......

或者我可以吗?

这是 ANR 对话框的正确行为还是我在这里遗漏了什么?有没有其他人经历过这种情况?用户在对话框中选择“关闭应用程序”选项后,有什么方法可以让我的应用程序关闭并保持关闭状态?(我猜不是)。

提前谢谢你,如果我在这里遗漏了一些明显的东西,请尽量温柔!:)

标签: androidforcecloseandroid-anr-dialog

解决方案


它取决于您的应用程序中可能存在的“前景”或“持久”方面。看看AppErrors.java

在终止进程之前调用 handleAppCrashLocked() - 您可以查看此处定义的条件,在这种情况下活动/服务将重新启动。检查这是否适用于您。

其次,如果您不在 AOSP 上工作,则无法修改重新启动应用程序的重新启动意图。因此,您唯一的选择是检测这是崩溃恢复并启动相应的屏幕。当您的应用程序通过崩溃恢复与常规启动启动时,您获得的意图会有所不同。

如果您正在使用 AOSP,您可以按照 AppErrors.java 中的线索进行操作


推荐阅读