—— 广播机制
纲要
- 广播简介
- 广播接收
- 动态注册
- 静态注册
- 广播发送
- 标准广播
- 有序广播
- 本地广播
- 最佳实践
简介-全局大喇叭
Android四大组件之一,为了便于进行系统级别的消息通信而引入广播机制
比IP网络的广播消息机制更灵活
- APP注册自己感兴趣的消息,只接收该部分广播消息(来自系统或其他APP)
- 完整的API,自由的接收/发送
广播两面
- 发送广播:Intent
- 接收广播:Broadcast Receiver
广播分类1
-
标准广播(Normal broadcasts):完全异步,无先后顺序无法被截断,效率高
-
有序广播(Ordered broadcasts):同步执行,有序可被截断,效率相对低
广播分类2
- 系统全局广播
- 本地广播
接收系统广播
接收各种系统状态信息
注册方式
- 动态注册:代码中注册
- 静态注册:AndroidMainifest.xml中注册
动态注册监听网络变化
创建广播接收器
创建一个继承自BroadcastReceiver的类,并重写父类的onReceive()方法即可。
简单四步走:
- 声明权限
- 注册(增加相应过滤)
- 重写onReceive()实现收到消息时的处理
-
销毁时记得注销
在收消息处理中如果要获取网络具体状态,调用相应系统服务和方法即可
静态注册实现开机启动
为何需要静态注册?
动态注册虽然灵活,但是必须启动后才能收到广播
快捷方式创建广播接收器,重写生成代码中的onReceive()方法即可:
- 静态广播接收器必须在AndroidMainifest.xml中注册才可以使用(receiver标签),自动生成已经有这部分
- exported属性表示是否接收本程序外的广播
- enabled表示是否启用该广播接收器
- intent-filter标签中增加对应启动action
- 增加启动权限声明
注意:广播接收器中不允许开线程,所以onReceive()方法中逻辑不要过于复杂耗时,方法运行过长时间没结束程序会报错,因此广播接收器一般扮演打开程序其他组件(如:状态栏通知消息、启动服务等)
发送自定义广播
发送标准广播
- 自定义广播接收器
- 定义类
- 同时在AndroidMainifest.xml中对广播接收器进行修改,指定名称以及action消息(值与发送值对应)
-
发送自定义广播
代码如下,发送消息值与接收器中定义一致:
可以根据需要在Intent中带参数
发送有序广播
-
发送有序广播只需要改为调用sendOrderedBroadcast()方法即可:
- 第一个参数还是Intent
- 第二个参数是一个与权限相关的字符串
- 广播顺序在注册时设定,在Intent-filter中增加android:priority参数指定,数越大优先级越高(取值范围:-1000~10000)
- 广播接收器如果需要截断广播消息,只要在接收时调用abortBroadcast()方法即可
使用本地广播
为什么需要本地广播
前面发送和接收的均为系统全局广播,任何应用都可以接收、也可以接收任何应用的广播,存在安全问题,故引入本地广播,保证消息只在应用程序内部收发广播。
原理:使用LocalBroadcastManager对广播进行管理,并提供发送广播和注册广播的方法:
- 通过localBroadcastManager的getInstance()方法获得实例
- 注册用localBroadcastManager实例的registerReceiver
- 发送用localBroadcastManager实例的sendBroadcast
-
同时类似的注意注销等逻辑即可
注意:本地广播无法通过静态注册方式接收
优势
- 不担心发送泄密
- 不担心接收引起漏洞
- 更高效
最佳实践
强制下线功能
思路:任何一个界面(接收广播)--> 弹出对话框提示异地上线(点确定按钮)--> 关闭所有界面弹出登录界面
难点:静态注册不可行(无法弹出),动态注册每个Activity注册不现实
解决方案/技术点:
- 强制下线逻辑不是写在Activity中而是在接收器中
- BaseActivity动态注册接收,所有Activity继承BaseActivity
- BaseActivity onResume()注册,onPause()注销
网友评论