在 Android ANR 对话框中按“关闭应用程序”,关闭并立即重新启动应用程序
Posted
技术标签:
【中文标题】在 Android ANR 对话框中按“关闭应用程序”,关闭并立即重新启动应用程序【英文标题】:Pressing "Close App" in Android ANR dialog, closes and immediately relaunches app 【发布时间】:2018-12-06 06:15:26 【问题描述】:我正面临一个奇怪的(在我看来)问题。我的应用很少产生 ANR。我试图尽可能减少它们,到目前为止我已经成功了。但是,当 ANR 对话框确实出现时,如果我(或任何用户)决定通过按 “关闭应用程序”而不是等待来关闭应用程序以使其响应,然后应用关闭,但立即重新启动,显示与显示 ANR 对话框时相同的活动。
这麻烦,因为当用户正常启动我的应用程序时,他/她会经历一定的活动序列,每个活动都负责执行一些任务,创建一些对象等。但是,当应用程序自动重新启动并且用户发现自己处于与显示 ANR 对话框时相同的活动中时,这一系列活动并没有发生,所以某些事情required 丢失,因此我的应用程序崩溃。可能是一个对象为空,一个 int 的值不正确,一些字符串可能为空等等。确切的问题在这里并不重要。 重要的是,应用程序没有完成用户打开时通常执行的一系列活动,设置所有这些对象、变量等,这些对象、变量等稍后在到达此活动之前需要。
另一方面,如果我的应用程序在任何时候崩溃,我有一个 UncaughtExceptionHandler 会以 “干净的方式” 关闭我的应用程序。 相当于用户按下“概览”按钮,然后通过按下“x”或向左/向右滑动来关闭应用程序。因此,如果用户想再次使用该应用程序,他/她将再次启动它,该应用程序将完成它应该执行的一系列活动,并且一切都按预期工作。但是,当出现 ANR 对话框时,我无法控制按“关闭应用程序”实际执行的操作...
或者我可以吗?
这是 ANR 对话框的正确行为还是我在这里遗漏了什么?有其他人经历过这种情况吗?用户在对话框中选择“关闭应用程序”选项后,有什么方法可以关闭我的应用程序并保持关闭状态? (我猜不是)。
提前谢谢你,如果我在这里遗漏了一些明显的东西,请尽量温柔! :)
【问题讨论】:
我不会温柔的大声笑花时间删除所有的 ANR,你的应用程序会更好。您可以做的另一件事是放入一些日志并在它开始时检查 logcat,以查看它在 ANR 之后如何启动。如果它不是你想要的,那么只需根据你所看到的来修复它 - 如果某些东西不应该是空的,那么做一个检查,如果它是空的,那么重新创建,所以它不是。这并不难,只是需要时间和思考,也许还有一些压力。 @CmosBattery 我不会反对你所说的任何事情。它可能被证明是唯一可行的解决方案。但是,我想知道关闭并立即重新启动应用程序是否应该在 ANR 对话框中按“关闭应用程序”。 【参考方案1】:这取决于您的应用程序中可能存在的“前景”或“持久”方面。 看看AppErrors.java
handleAppCrashLocked() 在杀死你的进程之前被调用——你可以看到这里定义的条件,在这种情况下活动/服务将被重新启动。检查这是否适用于您。
其次,如果您不在 AOSP 上工作,则无法修改重新启动应用程序的重新启动意图。因此,您唯一的选择是检测这是崩溃恢复并启动相应的屏幕。当您的应用程序通过崩溃恢复启动与常规启动时,您获得的意图会有所不同。
如果你在 AOSP 上工作,你可以从 AppErrors.java 中追踪
【讨论】:
感谢您的回答。我还没有时间来探索你的建议,但它看起来很有希望。由于赏金即将到期,我会用它来奖励你的回答,但如果它确实能解决我仍然认为开放的问题,我会接受你的回答。【参考方案2】:看看this
基本上,那个人试图完成的是记录未捕获的错误,正如您在帖子中所说的那样,您无法处理,并利用这些日志来纠正应用程序中的不一致性。
关闭应用程序通常会关闭应用程序并且不应该重新打开应用程序,但这完全取决于您的移动操作系统中的对话框实现,一些 OEM 会更改现有功能,有时它们会搞砸。
您还可以检查清单中的意图过滤器,以检查它们是否以某种方式干扰。
【讨论】:
【参考方案3】:我喜欢这里的链接 (https://mobikul.com/auto-restart-application-crashforce-close-android/)。 这是说如何自动重新启动强制关闭的应用程序。他们提供了一种方法来处理这些未在 try catch 块中捕获的错误。实际上我没有实现这个,因为我无法生成 ANR 对话框。 :-(
希望对你有帮助!
【讨论】:
以上是关于在 Android ANR 对话框中按“关闭应用程序”,关闭并立即重新启动应用程序的主要内容,如果未能解决你的问题,请参考以下文章