活动处于非活动状态时如何接收消息?

时间:2017-12-26 07:41:07

标签: android

我在活动中使用BroadcastReceiver来接收来自其他服务的消息。它运作良好,但问题是

当我的应用程序进入后台时,BroadcastReceiver将从活动中取消注册。因此,在活动结束前收到的消息将会丢失。

如何处理案件?

2 个答案:

答案 0 :(得分:0)

如果在Manifest中声明BroadcastReceiver,它将始终处于活动状态,即使应用程序已关闭也会被调用。

答案 1 :(得分:0)

场景A :仅限活动 如果您只需要在前台有活动时接收广播,请让活动使用registerReceiver()注册BroadcastReceiver。正如@MisterSquonk所指出的那样,你将在onResume()中注册接收器并在onPause()中注销它。

情景B :活动如果在前景,其他;有序广播 如果您希望前台活动处理广播,但如果该活动不在前台(例如,提出通知),并且广播是有序广播(例如,传入SMS),则您希望发生其他事情,那么您仍将使用Scenario A解决方案,但具有更高优先级的IntentFilter(请参阅setPriority())。此外,您将通过清单中的元素注册BroadcastReceiver,同一广播的优先级较低。在活动的BroadcastReceiver中,调用abortBroadcast()来使用该事件并阻止它到达清单注册的BroadcastReceiver。

场景C :活动如果在前景中,则其他;定期广播 如果场景B几乎适合,但您正在收听的广播不是有序广播,则需要从场景B开始。但是,让两个接收者在其各自的过滤器中拥有的广播是您自己的广播,使用私有@MisterSquonk建议的动作字符串。此外,在清单中注册了另一个BroadcastReceiver,它适用于您正在收听的真实广播。该接收器只需调用sendOrderedBroadcast()发送其他接收器正在侦听的有序广播。

情景D :无论前景如何 如果您的某些活动需要了解广播,并且它是否在前台并不重要,您需要重新考虑您的意思。通常,这实际上意味着广播会以某种方式影响您的数据模型,在这种情况下,您的关注点不应该是让活动知道,而是更新您的数据模型,并使用您已有的"让活动了解数据模型的变化"逻辑处理其余部分。

但是,如果您确信这不是数据模型的一部分,则可以实施方案B或方案C,并在静态数据成员中添加一些信息。您的活动可以检查onResume()中的静态数据成员,以便在返回到前台时获取有关广播的信息。

如果您正在思考"但是,如果我的流程在广播和其他活动到达前台之间终止怎么办?"那么您的广播真的正在更新您的数据模型,这个场景的开头段落。

如果您正在思考"但是,我想要更新正在后台工作的活动",那么相关活动就会被破坏。活动永远不应该在后台工作。这项工作应该委托给某种形式的服务,并且有一整套相关的场景来获得广播服务。