【问题标题】:Receiving a broadcast during Activity's lifecycle changes在 Activity 的生命周期变化期间接收广播
【发布时间】:2015-11-15 21:13:20
【问题描述】:

假设我有一个Activity。在其onCreate 生命周期回调中,我通过将其实现为匿名类来创建一个BroadcastReceiver 对象,并将一些代码放入它的onReceive 回调中,该回调需要ActivityContext 来显示Toast 消息被调用。在ActivityonResume 回调中我注册了BroadcastReceiver 并在onPause 中取消注册它,因为它包含需要ActivityContext 的代码,如果Activity 可能不可用正在经历破坏过程,即方向改变。这意味着,如果某事,即IntentService 在未注册的情况下为该BroadcastReceiver 广播Intent(无论多短,但它仍然可能发生),Intent 将永远不会被传递并且处理它的适当操作永远不会发生。所以用户可能会错过一些重要信息(通知成功注册的消息,警告出现问题等)我是对的吗?真的会发生这种情况吗?如何预防?无论应用程序的某些部分何时触发BroadcastReceiver,如何确保它能够接收到广播?

【问题讨论】:

  • 在这种情况下不要使用BroadcastReceiver,而是使用“绑定服务”模式
  • 我完全忘记了这样的事情。已经有一段时间没有为 Android 开发了 :(。我会考虑使用绑定服务的解决方案,但我仍然希望获得一些更简单的解决方案建议。

标签: android android-intent android-activity broadcastreceiver intentservice


【解决方案1】:

创建MyBroadcastReceiver 扩展BroadcastReceiver(当然是:D)并在清单中使用适当的意图过滤器操作注册它。然后在onReceive() 中,您将可以访问Application's Context。请记住,即使您的应用已关闭,onReceive() 也会被触发(例如,如果您的操作是 Intent.ACTION_SCREEN_OFF)。 这取决于您在该接收器中尝试执行的操作...如果您必须在您的应用中发送事件,请查看 EventBus https://github.com/greenrobot/EventBus

【讨论】:

  • BroadcastReceiveronReceive 中,我只想为用户显示一条消息,但该消息可能以 TextView 的形式显示,但没有 Activity' s Context 达到 TextView 毫无意义:)。
  • 好的,谁发消息?如果我做对了,您想在消息到达时将消息推送到队列中,当Activity 打开时,显示这些消息?您可能需要考虑保存这些消息...我想我不明白您为什么要在活动未打开时显示这些消息。
  • 你理解错了。我只想让Activity 知道什么时候,即一些Service 完成它的工作。如果Activity 被销毁是因为用户希望如此,则不应显示该消息,但我担心这可能发生在例如方向更改时。这样Activity 可能不会收到消息,使用户等待已经发送且永远不会再发送的消息。
  • 哦,好的!在这种情况下,您可能想要覆盖onConfigurationChanged(),这允许您设置横向布局而无需重新启动Activity。看看:stackoverflow.com/questions/5961054/…
  • @Salivan "... I liked the idea about saving messages somewhere and displaying them when Activity starts." 将其保存在服务中并在 Activity 绑定到服务时请求数据,请阅读"local bound service" 模式here
猜你喜欢
  • 2011-09-12
  • 1970-01-01
  • 1970-01-01
  • 2013-04-06
  • 1970-01-01
  • 2018-07-18
  • 2012-09-21
  • 2019-01-05
相关资源
最近更新 更多