什么是粘性广播?

94

我在Android文档中看到了这个术语,并附带了以下定义:

这些是广播,在完成后系统会保存其数据,以便客户端可以快速检索该数据而无需等待下一次广播。

这是什么意思?能否举一个特定的例子来解释它的用法?我认为我们需要请求权限才能使用此意图?为什么要这样做?

<uses-permission android:name="android.permission.BROADCAST_STICKY"/> - Allows an application to broadcast sticky intents.

6
2019年2月8日,如果有人在搜索“sticky broadcast”并到达这里,请注意:根据官方文档,“Sticky broadcasts”不应被使用。因为它们没有安全性(任何人都可以访问它们),也没有保护机制(任何人都可以修改它们),还有很多其他问题。建议的做法是使用非“Sticky broadcasts”来报告某个内容已经更改,并使用另一个机制使应用程序可以在需要时检索当前值。 - fangzhzh
4个回答

114
如果一个 Activity 使用普通广播调用 onPause,那么可能会错过接收广播的机会。可以在 onResume 中启动粘性广播并检查它。

更新于 2020 年 6 月 23 日

粘性广播已被弃用。

请参阅 sendStickyBroadcast 文档。

此方法在 API 级别 21 中已被弃用。

不应使用粘性广播。它们提供不安全性(任何人都可以访问它们),没有保护性(任何人都可以修改它们)以及许多其他问题。推荐的模式是使用非粘性广播报告某些内容发生了变化,并使用另一种机制在需要时为应用程序检索当前值。

实现

Intent intent = new Intent("some.custom.action");
intent.putExtra("some_boolean", true);
sendStickyBroadcast(intent);

资源


嗨,我对粘性广播和静态注册广播感到困惑。我刚刚在某个地方读到,在清单文件中注册广播和以编程方式注册广播之间的区别仅在于后者不会注销广播,而是保留在那里,而前者则在onPause()方法中注销广播。 - Shaista Naaz
注:在大多数情况下,应避免使用粘性广播。有关更多信息,请参见@Nikhil_Katre的答案中的链接。 - gMale
@Shaista:清单接收器在你的应用处于休眠状态时仍然可以运行,而编程接收器仅在其所注册的应用程序正在运行时才会响应。 - gMale
@gmale 如果我们处于活动状态并且在onPause()中调用了unregisterReceiver(),那么当我们在onResume()中恢复时,我们会收到广播吗? - Kushal
1
@PaulBurke,我在上面给出的链接中没有找到名字为Mark Murphy的人。这个链接将我重定向到问题,而不是确切的答案。你能否更新一下URL? - Vishal Chhodwani

13

sendStickyBroadcast()执行一种称为sticky的sendBroadcast(Intent),也就是发送的Intent在广播完成后仍然存在,以便其他人可以通过registerReceiver(BroadcastReceiver, IntentFilter)的返回值快速检索到这些数据。在所有其他方面,它与 sendBroadcast(Intent)的行为相同。操作系统通过发送一个sticky广播ACTION_BATTERY_CHANGED来提供示例。当您为该操作调用registerReceiver()--即使使用空的BroadcastReceiver--您将获得最后一次广播该操作的Intent。因此,您可以使用它来查找电池状态,而无需注册所有未来的电池状态更改。


9
粘性广播的值是最后一次广播的值,目前保存在粘性缓存中。这不是刚刚接收到的广播的值。可以说它像浏览器 cookie,您随时都可以访问它。根据粘性广播方法的文档(例如:这里),现在已经弃用了粘性广播:

此方法在API级别21中已被弃用。不应使用粘性广播。它们没有提供安全性(任何人都可以访问它们)、没有保护性(任何人都可以修改它们)以及许多其他问题。推荐的模式是使用非粘性广播来报告某些内容已更改,并使用另一种机制为应用程序检索当前值。


3

普通的广播意图在发送并被系统处理后不再可用。如果您使用sendStickyBroadcast(Intent)方法,则意图是粘性的,这意味着您发送的意图在广播完成后仍然存在。

您可以参考我的博客:点击此处进入链接


2
我已经添加了你所链接的博客作者身份的必要披露。从现在开始,你必须自己完成这个步骤,否则你的帖子将被视为垃圾邮件并被删除。 - Andrew Barber

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接