广播机制
1.广播接收器(Broadcast Receiver) :
1.标准广播 : 是一种完全异步执行的广播,在广播发出之后,所有的广播接收器几乎都会在同一时刻接收到这条广播消息,
因此它们之间没有任何先后顺序可言。这种广播的效率会比较高,但同时也意味着它是无法被截断的。
2.有序广播 : 是一种同步执行的广播,在广播发出之后,同一时刻只会有一个广播接收器能够收到这条广播消息,
当这个广播接收器中的逻辑执行完毕后,广播才会继续传递。所以此时的广播接收器是有先后顺序的,
优先级高的广播接收器就可以先收到广播消息,并且前面的广播接收器还可以截断正在传递的广播,
这样后面的广播接收器就无法收到广播消息了。
2.动态注册监听网络变化 : 缺点,必须该活动启动时,才能使用广播器
1.创建一个广播器,继承BroadcastReceiver现实onReceive方法
2.在活动的onCreate方法中,创建IntentFilter 并且监听Intent的变化
3.为被监听者注册一个广播器
IntentFilter filter = new IntentFilter();
filter.addAction("android.net.conn.CONNECTIVITY_CHANGE"); //监听网络变化时的广播器 : 当网络状态发生变化时
network = new NetWorkchangeBroadCast(); //BroadcastReceiver的子类
registerReceiver(network, filter); //将自定义的广播器注册到这个IntentFilter链中
4.最后在活动销毁行为中注销掉该广播器
3.静态注册实现开机启动 : 优点,不需要启动该活动也可以使用广播器
1.创建一个广播器,继承BroadcastReceiver现实onReceive方法
2.AndroidManifest.xml中注册该广播器 标签为 <receiver>
<receiver android:name=".broadcast.BootCompleteReceiver">
<intent-filter> <!-- 为手机开机注册一个静态的广播器 需要权限 -->
<action android:name="android.intent.action.BOOT_COMPLETED"/>
</intent-filter>
</receiver>
4.需要注意的是:
不要在 onReceive()方法中添加过多的逻辑或者进行任何的耗时操作, 因为在广播接收器中是不允许开启线程的,
当 onReceive()方法运行了较长时间而没有结束时, 程序就会报错。
因此广播接收器更多的是扮演一种打开程序其他组件的角色,比如创建一条状态栏通知,或者启动一个服务等。
5.发送自定义标准广播:
1.创建一个Intent 名字为com.example.broadcasttest.MY_BROADCAST
2.sendBroadcast(intent); 通过广播形式发送该意图(Intent),发送标准广播
3.创建一个广播器,继承BroadcastReceiver现实onReceive方法
4.在AndroidManifest.xml中监听该意图(Intent)
6.发送自定义有序广播
1.sendBroadcast(intent); 替换成 sendOrderedBroadcast(intent, null); 发送有序广播
2.在AndroidManifest.xml 设置优先级 <intent-filter android:priority="100" >
3.在onReceive方法中调用abortBroadcast();表示广播截断, 后面的广播接收器将无法再接收到这条广播
7.本地广播(LocalBroadcastManager)
1.由LocalBroadcastManager类调起的方法都是本地广播。用法和全部广播一致
本地广播的优势:
1.可以明确地知道正在发送的广播不会离开我们的程序, 因此不需要担心机密数据泄
漏的问题。
2. 其他的程序无法将广播发送到我们程序的内部, 因此不需要担心会有安全漏洞的隐
患。
3. 发送本地广播比起发送系统全局广播将会更加高效。
注:在多个广播器在同时监听同一个意图时,是可以的,也能接收到