【问题标题】:What is a Sticky Broadcast?什么是粘性广播?
【发布时间】:2010-08-16 05:59:18
【问题描述】:

我在附带定义的 android 文档中遇到了这个术语

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

这是什么意思?有人可以用一个特定的例子详细说明它的用途吗?我相信我们必须请求许可才能使用此意图?为什么会这样?

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

【问题讨论】:

  • 08/Feb/2019,适用于任何搜索粘性广播并在此处结束的人,来自 official doc Sticky broadcasts should not be used. They provide no security (anyone can access them), no protection (anyone can modify them), and many other problems. The recommended pattern is to use a non-sticky broadcast to report that something has changed, with another mechanism for apps to retrieve the current value whenever desired.

标签: android android-intent


【解决方案1】:

如果 Activity 调用 onPause 并使用正常广播,则可能会错过接收广播。在onResume 发起粘性广播后,可以检查它。

2020 年 6 月 23 日更新

不推荐使用粘性广播。

See sendStickyBroadcast documentation.

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

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

实施

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

资源

【讨论】:

  • 嗨,我对粘性广播和广播的静态注册感到困惑。我刚刚在某处读到,在清单文件中注册广播和以编程方式注册之间的区别仅在于另一个不取消注册广播但它保留在那里,而后一个在 onPause() 方法中取消注册广播。
  • 注意:在大多数情况下,应避免粘性广播。请参阅the link in the answer from @Nikhil_Katre 了解更多信息
  • @Shaista:即使您的应用程序处于休眠状态,清单接收器也会运行,而程序化接收器仅在其注册的应用程序运行时才会响应
  • @gmale 所以,如果我们是活动并且我们在 onPause() 并且我们已经调用了 unregisterReceiver().. 当我们在 onResume() 中恢复时我们会收到广播
  • @PaulBurke 我在上面给出的链接中没有找到名字 Mark Murphy。此链接将我重定向到不在确切答案上的问题。你能更新一下网址吗?。
【解决方案2】:

sendStickyBroadcast() 执行一个被称为粘性的sendBroadcast(Intent),即您发送的 Intent 在广播完成后仍然存在,以便其他人可以通过registerReceiver(BroadcastReceiver, IntentFilter) 的返回值快速检索该数据。在所有其他方面,它的行为与sendBroadcast(Intent) 相同。通过操作系统发送的粘性广播的一个示例是ACTION_BATTERY_CHANGED。当您为该操作调用registerReceiver() 时——即使BroadcastReceiver 为空——您将获得最后一次为该操作广播的 Intent。因此,您可以使用它来查找电池的状态,而不必注册电池中所有未来的状态变化。

【讨论】:

    【解决方案3】:

    粘性广播的值是上次广播的值,当前保存在粘性缓存中。这不是现在收到的广播的值。我想您可以说它就像您可以随时访问的浏览器 cookie。根据粘性广播方法的文档 (e.g.),粘性广播现在已被弃用:

    此方法在 API 级别 21 中已弃用。粘性广播应该 不被使用。它们不提供安全性(任何人都可以访问它们),不 保护(任何人都可以修改它们),以及许多其他问题。这 推荐的模式是使用非粘性广播来报告 发生了一些变化,应用程序使用了另一种机制来检索 需要时的当前值。

    【讨论】:

      【解决方案4】:

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

      你参考我的博客:enter link description here

      【讨论】:

      • 我已添加要求披露您对所链接博客的作者身份。从现在开始,您必须自行执行此操作,否则您的帖子将作为垃圾邮件被删除。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-07-10
      • 2014-11-15
      相关资源
      最近更新 更多