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

Android 活动处于非活动状态时如何接收消息?,android,Android,我正在活动中使用BroadcastReceiver接收来自其他服务的消息。它工作得很好,但问题是 当我的应用进入后台时,BroadcastReceiver将从活动中注销。因此,在活动开始前收到的消息将丢失。 如何处理此情况?如果您在清单中声明BroadcastReceiver,它将始终处于活动状态,即使应用程序已关闭,也会被调用。场景A:仅活动 如果您只需要在前台有活动时接收广播,请让活动使用registerReceiver()注册广播接收器。正如@MisterSquonk所指出的,您将在onR

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

当我的应用进入后台时,BroadcastReceiver将从活动中注销。因此,在活动开始前收到的消息将丢失。


如何处理此情况?

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

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

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

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

场景D:不考虑前景的活动 如果你的某些活动需要了解广播,而不管它是否在前台,你需要重新思考你的意思。通常,这实际上意味着广播会以某种方式影响您的数据模型,在这种情况下,您不应该让活动知道,而应该更新您的数据模型,并使用您已经存在的“让活动知道数据模型更改”逻辑来处理其余部分

但是,如果您确信这不是数据模型的一部分,那么可以实现场景B或场景C,并将一些信息粘贴到静态数据成员中。您的活动可以检查onResume()中的静态数据成员,以便在返回前台时获取有关广播的信息

如果您在想“但是,如果我的进程在广播和其他进入前台的活动之间终止怎么办?”,那么您的广播实际上是在更新您的数据模型,根据本场景的开头段落


如果你想“但是,我想更新一个在后台工作的活动”,那么这个活动就被打断了。活动不应在后台进行。这项工作应该委托给某种形式的服务,并且有一整套相关的场景用于向服务发送广播。

您使用广播接收器执行的操作是什么?