我在Android文档中遇到了这个术语,附带定义
这些是数据在完成后由系统保存的广播,因此客户端可以快速检索该数据而无需等待下一次广播。
这是什么意思?有人可以用特定的例子详细说明它的用法吗?我相信我们必须要求获得使用此意图的许可吗?为什么这样?
<uses-permission android:name="android.permission.BROADCAST_STICKY"/> - Allows an application to broadcast sticky intents.
答案 0 :(得分:101)
请在此处阅读Mark Murphy的解释: what is the difference between sendStickyBroadcast and sendBroadcast in Android
以下是一个如何使用粘性广播的抽象示例:
Intent intent = new Intent("some.custom.action");
intent.putExtra("some_boolean", true);
sendStickyBroadcast(intent);
如果您正在冻结的活动(onPause)中收听此广播,您可能会错过实际的活动。这允许您在触发广播后检查广播(onResume)。
编辑:有关粘性广播的更多内容......
另请查看removeStickyBroadcast(Intent)
,以及API级别5 + isInitialStickyBroadcast()
,以便在接收方的onReceive
中使用。
希望有所帮助。
答案 1 :(得分:21)
请注意,Sticky广播对系统很重,不鼓励。请在Android开发者小组的'Sticky Broadcasts and Concurrency Options'讨论中阅读hackbod的说明。
@Shouvik,请指明您考虑使用StickyBroadcasts的确切场景。有人可能会提出替代解决方案。
答案 2 :(得分:8)
sendStickyBroadcast()
执行称为粘性的sendBroadcast(Intent)
,即您发送的意图在广播完成后保持不变,以便其他人可以通过{{1}的返回值快速检索该数据}。在所有其他方面,这与registerReceiver(BroadcastReceiver, IntentFilter)
的行为相同。通过操作系统发送的粘性广播的一个示例是sendBroadcast(Intent)
。当您为该操作调用ACTION_BATTERY_CHANGED
时 - 即使使用空registerReceiver()
- 您将获得上次为该操作广播的Intent。因此,您可以使用它来查找电池的状态,而无需注册电池中所有未来的状态更改。
答案 3 :(得分:8)
粘性广播的值是上次广播的值,当前保存在粘性缓存中。这不是现在收到的广播的价值。我想你可以说它就像一个浏览器cookie,你可以随时访问。粘性广播现已弃用:
此方法在API级别21中已弃用。粘性广播应该 不被使用。它们没有安全性(任何人都可以访问它们),没有 保护(任何人都可以修改它们)以及许多其他问题。该 推荐的模式是使用非粘性广播来报告 一些东西已经改变,另一种机制让应用程序检索 当需要时的当前值。
答案 4 :(得分:2)
系统发送和处理后,普通广播Intent不再可用。如果你使用sendStickyBroadcast(Intent)方法,那么意图是粘性的,这意味着你发送的意图在广播完成后保持不变。
您可以参考我的博客:enter link description here