专栏首页极客猴Android中广播实践小结

Android中广播实践小结

Android系统有一套广播消息机制,方便进行每个应用程序之间的消息通知。而且广播接受者作为Android四大组件之一,经常被使用到。我也接触到广播消息机制,因此有必要对自己所学的知识梳理整理下。

0x01 广播分类

  • 标准广播 标准广播是一种完全异步执行的广播。这种广播是一种一对多的广播,效率比较高。当广播被发出之后,所有的广播接受者几乎会在同一时间收到消息。
  • 有序广播 有序广播是一种同步执行的广播。这种广播顾名思义是有接受顺序的广播。当广播被发出之后,只有一个广播接受者会收到消息。因此,该广播是一对一的广播。

0x02 注册广播

  • 动态注册 通过Java代码注册。广播接受者可以自由地对自己感兴趣的广播进行注册,并内部处理响应广播的逻辑。这种方式虽然灵活,当也有一定的局限性。它要求应用程序在运行时才能进行。
  • 静态注册 在AndroidManifest.xml中注册。这种方式可以在应用程序还没有启动就注册接受广播了。

动态注册经典代码

静态注册经典代码

在AndroidManifest文件Application节点内添加如下代码:

该广播接受者名为MyBroadcastReceiver。其有两个属性:enabled属性表示是否启用这个广播接受者;exported属性表示是否允许这个广播接受者接受本程序以外的广播。

0x03 静态注册广播与动态注册广播的区别

  • 静态注册即使App退出,仍然能接收到广播
  • 动态注册时,当Activity退出,就接收不到广播了
  • 但是静态注册即使App退出,仍然能接收到广播这种说法自Android 3.1开始有可能不再成立。

说明: Android 3.1开始系统在Intent与广播相关的flag增加了参数: 1) FLAG_INCLUDE_STOPPED_PACKAGES:包含已经停止的包(停止:即包所在的进程已经退出) 2) FLAG_EXCLUDE_STOPPED_PACKAGES:不包含已经停止的包 自Android3.1开始,系统本身增加了对所有App当前是否处于运行状态的跟踪。在发送广播时,不管是什么广播类型,系统默认直接增加了值为FLAG_EXCLUDE_STOPPED_PACKAGES的flag,导致即使是静态注册的广播接收器,对于其所在进程已经退出的App,同样无法接收到广播。 因此对于系统广播,由于是系统内部直接发出的,无法更改此intent的flag值。因此,从3.1开始对于静态注册的接收系统广播的BroadcastReceiver,如果App进程已经退出,将不能接收到广播。 但是对于自定义的广播,可以通过覆写此flag为FLAG_INCLUDE_STOPPED_PACKAGES,使得静态注册的BroadcastReceiver,即使所在App进程已经退出,也能接收到广播,并会启动应用进程,但此时的BroadcastReceiver是新建的。 实现代码为:

在3.1以前,不少App可能通过静态注册方式监听各种系统广播,以此进行一些业务上的处理(如即使App已经退出,仍然能接收到,可以启动service等..)。

3.1后,静态注册接受广播方式的改变,将直接导致此类方案不再可行。于是,通过将Service与App本身设置成不同的进程已经成为实现此类需求的可行替代方案。

0x04 发送广播

  • 发送标准广播
  • 发送有序广播

需要在AndroidManifest文件中通过设定广播接受者的intent-filter节点的priority属性来确定接受广播的顺序。

如果想把广播截断,可以在onReceive()中调用abortBoradcast()

0x05 使用本地广播

为了让广播只在应用程序中传递,这就需要LocalBroadcastManager大显身手。我们通过代码来熟悉。

0x06 广播的最佳实践

广播可以应用于强制下线或者被挤下线的逻辑操作

作者:猴哥,公众号:极客猴。爱好读书,喜欢钻研技术,梦想成为文艺青年的IT Boy。

- END -

本文分享自微信公众号 - 极客猴(Geek_monkey),作者:猴哥

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2016-12-28

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 聊聊Activity那些事

    Activity身为四大组件之一,在整个App中扮演着向用户呈现界面的角色。在平常的开发中,我们会自定义一个类去继承Activity去实现界面。而Activit...

    猴哥yuri
  • Django 2.1 版本已经来袭

    一个备受关注、很多人都在使用的软件,软件开发团队会定期发布新版本。其主要目的是修复之前一些 Bug 以及新增一些新特性。Django 作为主流的 Python ...

    猴哥yuri
  • 一篇文章彻底了解HTTP发展史

    HTTP 协议可以算是在人们日常生活、工作用得比较多的协议。我们使用浏览器访问网页,就是通过 HTTP 来传递数据;客户端跟服务器交互,大部分会使用到 HTTP...

    猴哥yuri
  • Android高频面试专题 - 基础篇(四)BroadcastReceiver

    Android 中的广播使用了设计模式中的观察者模式:基于消息的发布/订阅事件模型。

    Android扫地僧
  • 使用广播-BroadcastReceiver最详细解析

    广播,大家应该可以理解,我们在学校做眼保健操时,就有个广播,告诉我们要做眼保健操了。广播传递信息告诉我们要做什么,通知信息或传递数据等。广播接收器是用来接收来自...

    达达前端
  • Android查缺补漏--BroadcastReceiver的类型与使用

    Broadcast 是一种被用于应用内和应用之间传递信息的机制。一个广播可以对应多个接受者。一个完整的广播机制,需要具有以下三个要素: 发送广播的Broadca...

    codingblock
  • 从0系统学Android--5.2 发送广播

    前面已经学习了如何接受广播了,下面来学习如何发送自定义广播,广播类型分为:标准广播和有序广播,下面分别来说一下这两种广播如何发送。

    开发者
  • Android学习--广播机制

            标准广播:  是一种完全异步执行的广播,在广播发出去之后,所有的广播接收器几乎是同一时接收到这条广播。

    Mr.RisingSun
  • 从0系统学Android--5.1 广播机制

    Android 中每个应用程序都可以对自己感兴趣的广播进行注册,这样当注册的广播发出时,应用程序就会接受到。这些广播可能来自系统,也可能来自其他应用程序。

    开发者
  • 从源码角度看广播

    几乎每个安卓应用都无可避免的使用到广播。例如监听WIFI的开启状态、时间的获取,甚至是我们最常用的闹钟功能,都是结合着AlarmManager与广播来实现的。理...

    蜻蜓队长

扫码关注云+社区

领取腾讯云代金券