当前课程知识点:Android应用开发基础 > 第五章 广播 > 5.2 Android广播工作原理 > 5.2 Android广播工作原理
本节我们介绍广播接收器的工作流程
广播接收器的处理流程如下图所示
广播接收器的生命周期
取决于onReceive方法
广播接收器一旦处理完业务
也就是onReceive执行完毕
广播接收器对象将会处于失活状态
Android系统有权在内存资源紧张的时候
回收广播接收器
不要在onReceive中编写耗时操作
onReceive方法运行于应用的主线程中
一旦处理耗时操作将会导致ANR错误
4 注销广播接收器后
广播接收器将不会再收到任何广播数据
Android中广播注册流程如图所示
Android系统中有一个广播接收器注册列表
RegisteredReceivers
第二
使用super.registerReceiver
可以注册广播到广播接收器
比如
CustomerActivity中
注册了一个短信广播
NetworkService中
注册了一个网络状态的广播
广播接收器的注册
分为动态注册和静态注册
Android7.0后只提供动态注册
动态注册广播接收器的方法如下图所示
使用context. registerReceiver方法
注册广播接收器
注册广播接收器时需要提供
广播接收器对象
广播接收器Action 频道
静态注册广播接收器的方法如下图所示
1 广播接收器被注册到
AndroidManifest.xml配置文件
2 注册广播接收器时
需要提供广播接收器类全名
和广播接收器Action 频道
广播接收器注册的原理如图所示
1 所有的广播接收器都会被注册到
ActivityManagerService中
2 使用registerReceiver方法
通过动态方式注册接收器
3 PackageMangerService
扫描所有Android应用的
AndroidManifest.xml配置信息文件
4 将配置文件中的静态配置的接收器
注册入ActivityManagerService中
5 注册完接收器后
为接收器设置的Action频道
同时会与广播接收器捆绑
6 所有的广播接收器都被注册在
RegisteredReceivers列表中
当一个广播发送到ActivityManagerService中
满足广播Action的接收器
将会获取广播的对应数据
也就是接收器的onReceive方法
将会被回调
广播接收器接收广播的原理如图所示
1 所有的广播均会被发送到
ActivityManagerService
2 收到广播后
ActivityManagerService
从RegisteredReceivers列表中
寻找满足当前广播Action的Receiver
3 将满足Action的Receiver保存入队列中
准备发送广播
4 依次发送广播给队列中的Receiver
5 Receiver中保存了应用的PID 进程ID
6 Receiver收到ActivityManagerService
传递过来的数据
7 Receiver的onReceive方法
可以接受到本次数据传递
下面以一个网络状态显示的实例
来学习广播的发送和接收流程
当网络不能使用的时候
我们希望app能够有提示
如图所示
微信在网络状态不能连接的时候
会提示网络连接不能使用
它是如何实现的呢
下面我们以一个显示网络状态的实例
来讲解如何获取系统的网络广播
当网络是wifi的时候
显示wifi连接
当网络是4G信号的时候
显示4G信号
下面我们讲解如何实现网络状态广播的接收
1 编写广播接收类 NetworkStatusReceiver
接收广播
继承BroadcastReceiver
并重写onReceive方法
如图所示
1.1 首先使用intent.getAction()
取出意图的名称
1.2 判断意图是否为网络状态改变的广播
CONNECTIVITY_CHANGE
1.3 使用自定义的getAPNType方法
判断网络类型
1.4 将网络状态的编号和数据
使用EventBus发送到EventBus总线上
2 分析并获取网络状态
如下图所示
2.1 首先使用getSystemService
获得系统的网络管理器
2.2 使用getActiveNetworkInfo
获取系统的网络详细信息
2.3 使用getType()获取网络类型
2.4 如果网络的类型为移动信号
2.5 使用networkInfo.getSubtype()
获取子网络类型
2.6 返回网络类型
3 在Activity中注册广播接收器
NetworkStatusReceiver
如图所示
3.1 定义广播接收器
3.2 将Activity活动注册到EventBus
3.3 初始化广播接收器对象
3.4 新建网络状态广播过滤器
3.5 设置广播接收器接收网络状态广播
4 NetworkStatusReceiver与MainActivity
通过EventBus传递数据
如图所示
4.1 新建eventCode变量代表数据类型
4.2 新建iBatterydata变量代表网络类型
5 Activity中使用EventBus获取信息
电池电量信息均被保存在EventData对象
如图所示
5.1 重写Event的消息处理方法
5.2 使用event.getEventCode()
判断是否是网络状态类型广播消息
5.3 使用event.getiBatterydata()
取出网络状态类型的数据
并显示到组件上
6 应用程序退出注销
EventBus和广播接收器
如图所示
6.1 视图中重写onDestroy()方法
6.2 使用super.unregisterReceiver
注销广播接收器
6.3 使用EventBus.getDefault().unregister(this)方法
注销EventBus接收
下面就是我们最后的效果
如图所示
我们可以看到当网络是wifi的时候
显示wifi连接
当网络是4G信号的时候
显示4G信号的连接
这就是我们使用广播
来显示网络状态显示的一个实例
-Android Studio4.1.2安装常用问题汇总2021.3.15
-1.1 Android概述
--1.1 Android Studio安装与配置-实践案例
-1.1 Android概述--作业
-1.2 Android程序
-1.2 Android程序--作业
-1.3 Android程序调试
-1.3 Android程序调试--作业
-2.1 Activity概述
-2.1 Activity概述--作业
-2.2 Activity应用
-第2章 Android视图--2.2 Activity应用
-3.1 Activity布局
-3.1 Activity布局--作业
-3.2 Android基础组件
-3.2 Android基础组件--作业
-3.3 Android中级组件
-3.3 Android中级组件--作业
-3.4 Android适配器
-3.4 Android适配器--作业
-4.1 Fragment碎片组件
-4.1 Fragment碎片组件--作业
-4.2 ViewPager翻页类组件
-4.2 ViewPager翻页类组件--作业
-讨论:fragment与activity的生命周期有哪些不同?
-5.1 Android广播概述
-5.1 Android广播概述--作业
-5.2 Android广播工作原理
-5.2 Android广播工作原理--作业
-5.3 自定义广播
-第5章 广播--5.3 自定义广播
-5.4 有序广播
--5.4有序广播
-第5章 广播--5.4 有序广播
-6.1 系统服务概述
-6.1 系统服务概述--作业
-6.2 访问系统服务
-6.2 访问系统服务--作业
-6.3 自定义服务
-第6章 Android服务--6.3 自定义服务
-6.4 多线程
--6.4 多线程
-第6章 Android服务--6.4 多线程
-7.1 Android运行权限
-7.1 Android运行权限--作业
-7.2 URL URI概述
-第7章 内容提供者ContentProvider--7.2 URL URI概述
-7.3 ContentProvider概述
-第7章 内容提供者ContentProvider--7.3 ContentProvider概述
-7.4 访问通讯录
-第7章 内容提供者ContentProvider--7.4 访问通讯录
-7.5 课后作业案例
-8.1 相机服务
--8.1 相机服务
-8.1 相机服务--作业
-8.2 音视频服务
-8.2 音视频服务--作业
-9.1 网络服务概述
-9.1 网络服务概述--作业
-9.2 网络框架
--9.2 网络框架
-9.2 网络框架--作业
-9.3 Json
--9.3 Json
-第9章 网络技术--9.3 Json
-9.4 Volley
-第9章 网络技术--9.4 Volley
-10.1 文件存储
--10.1.3 实践案例-SharedPreference文件读写
-10.1 文件存储--作业
-10.2 数据库存储
-10.2 数据库存储--作业
-第1章 实训简介以及开发环境配置
-第2章 在线音乐播放器整体设计以及服务端开发
-第3章 在线音乐播放器-客户端开发
-第4章 在线音乐播放器-完整版
-第5章 QQ聊天项目
-第6章 在线点餐系统