先上一张图——整篇文章的精华
在广播接收器中是不允许开启线程的;广播是一种可以跨进程的通信方式
**一.系统全局广播:**发出的广播可以被其他任何应用程序接收到,也可以接收来自于其他任何应用程序的广播,因此容易引起安全问题(发送的广播被截断,接收到垃圾广播)
**一)广播接收器:**监听广播来得到各种系统的状态信息
1.创建:
1).新建一个类MyReceiver,继承BroadcastReceiver
2).重写onReceive方法(收到广播时的动作,比如提示,日志,做下一步操作)
2.注册
Android系统为了保证系统安全性,因此要声明权限,在AndroidMainfest.xml中添加<use-permission>
1)动态注册
// 1.创建IntentFilter实例
IntentFilter intentFilter = new IntentFilter();
// 2.addAction(“广播名”),要监听什么,就添加什么广播名
intentFilter.addAction("android.net.conn.CONNECTIVITY_CHANGE");//网络变化是发出的广播就是“android.net.conn.CONNECTIVITY_CHANGE”
// 3.调用registerReceiver()方法,把接收器(MyReceiver)和IntentFilter传进去
myReceiver = new MyReceiver();
registerReceiver(myReceiver, intentFilter);
......
//4.动态注册的广播接收器一定要取消注册,
unregisterReceiver(myReceiver);
2)静态注册(在AndroidMainfest.xml中)
<receiver android:name=".receiver.MyReceiver">
<intent-filter>
<action android:name="android.intent.action.LOCKED_BOOT_COMPLETED">
</action>
</intent-filter>
</receiver>
二)发送自定义广播
**1)标准广播:**完全异步执行,所有广播接收器几乎都会在同以时刻接收到这条广播,没有先后顺序,不能截断,效率高。
//1.构建Intent对象(传入广播的值)
Intent intent = new Intent("广播的值");
//2.发送广播sendBroadcast(Intent)
sendBroadcast(intent);
**2)有序广播:**同步执行的广播,同一时刻只有一个广播接收器可以收到,有顺序,可以被截断
//1.构建Intent对象(传入广播的值)
Intent intent = new Intent("广播的值");
//2.sendOrderedBroadcast(intent,null)
sendOrderedBroadcast(intent,null);
如果想要设置顺序,可以在注册的时候设定优先级:
android:priority="100"
截断广播
abortBroadcast()
**二.本地广播:**发出和接收都只会在本应用程序的内部进行,无法通过静态注册的方式来接收,因此不需担心机密数据泄露问题;不需担心有安全漏洞的隐患;发送本地广播比发送全局广播更高效。
和系统全局广播大致相似,不过要通过LocalBroadcastManager.getInstence(this)获取
LocalBroadcastManager实例,然后在系统全局广播中的.registerReceiver(),unregisterReceiver(),sendBroadcast(),sendOrderedBroadcast()等方法由LocalBroadcastManager来管理调用。
学习参考:《第一行代码——Android》