【问题标题】:Android Broadcast Receiver and Force Close (Uncaught exceptions)Android 广播接收器和强制关闭(未捕获的异常)
【发布时间】:2011-06-29 00:41:51
【问题描述】:

我有一个多活动应用程序,在大多数屏幕上都有一个退出/注销按钮。

按下按钮时,它会显示一个确认对话框,然后发送一个“退出”广播。

我在每个简单地调用finish() 活动的活动上都有一个广播接收器,在 OnDestroy 中我取消了接收器的注册。该代码在正常使用中运行良好。

我面临的问题是如果弹出未捕获的异常并且发生强制关闭。

按 OK 后,最后一个活动显示出来。当我按下退出/注销按钮时 广播似乎没有被其他活动接收。

我通常必须退出每个活动,或者在某些情况下第二次按下广播传播的退出按钮。

我知道我可以设置 Thread.setDefaultUncaughtExceptionHandler() 但是,

我在这里有什么遗漏的吗?

logcat 没有显示任何内容。

【问题讨论】:

  • 您的应用中不应有退出按钮。见blog.radioactiveyak.com/2010/05/…
  • 该应用程序确实需要一个注销按钮,因为它需要用户登录到系统,并且他可以选择何时注销。作为一个金融应用程序,这是非常必要的。很高兴 Android 的工程师不想要退出按钮,但在现实世界的场景中需要它。
  • 退出按钮与注销按钮不同。一定要有一个注销按钮。务必在 onPause 或 onStop 中注销。但是,您确实不需要 需要退出按钮。应用程序生命周期提供了处理这种情况所需的方法,您应该使用它们。
  • 我明白了。我的问题实际上是关于向其他活动传播(广播)消息以及未捕获的异常似乎正在破坏广播的接收这一事实。
  • 未捕获的异常意味着您的应用程序出现严重问题 - 如果您自己不处理它,那么 Android 会认为它足够严重以至于您的应用程序无法恢复,这就是为什么它(或部分it) 被终止,不再执行任何代码。您可以使用startActivityForResultonActivityResult 将消息发送回之前的活动,但您可能应该先捕获所有异常。

标签: android broadcastreceiver


【解决方案1】:

我在每个简单调用finish() 活动的活动上都有一个广播接收器,在 OnDestroy 中我取消了接收器的注册。该代码在正常使用中运行良好。

不,它没有。

您的方法假设所有活动都在内存中。不能保证一定是这样。它们可能是任务的一部分,但不在 RAM 中,它们的状态通过onSaveInstanceState() 保存。因此,他们将不会收到您的广播。

当用户选择“注销”菜单选项或操作栏条目时,您应该清除您的身份验证凭据(可能保存在静态数据成员或自定义 Application 对象中),然后启动允许用户登录的任何活动in。您的所有活动都应在onResume() 中检查您是否具有有效的身份验证凭据——如果没有,则启动任何允许用户登录的活动。

除其他外,这消除了给您带来困难的广播。

我知道我可以设置 Thread.setDefaultUncaughtExceptionHandler() 但是,

您应该在编写第一个活动之前完成此操作。

【讨论】:

  • 谢谢。我重新设计了应用程序以消除广播并在 OnResume() 上检查凭据的有效性。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多