- 广播的发送:通过intent; 广播的接收:通过广播接收者(Broadcast Receiver)
- 广播的分类:无序广播和有序广播
- 无序广播:无法被截断
- 有序广播:按顺序发送广播,优先级高的先接收到广播,并且可以中断广播的传递,后面的广播接收器将无法接收到广播
- 注册广播的两种方式
- 动态注册:代码中注册
- 静态注册:清单文件中注册
- 动态注册广播
新建一个类,让它继承BroadcastRecevier,重写onReceive()来接收广播,在activity中通过registerReceiver(receiver,intentFilter)来注册, unregisterReceiver()来反注册,一般在activity的onDestroy()方法中来取消接收广播 - 案例1 接收网络状态发生变化时的系统广播
IntentFilter intentFilter = new IntentFilter();
intentFilter.addAction("android.net.conn.CONNECTIVITY_CHANGE");
registerReceiver(myReceiver,intentFilter);
注意需要在清单文件中声明权限:
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
- 案例2 静态注册开机广播
权限:<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>
清单文件中添加<receiver>以及<intent-filter>中指定action - 注意事项:不要在onReceive()方法中添加过多的逻辑或者耗时操作,以免ANR
- 发送自定义广播
- 发送标准广播 sendBroadcast();
Intent intent = new Intent("com.evan.broadcasttest.MY_BROADCAST");
sendBroadcast(intent);
广播发送出去,需要自己写一个广播接收者来接收这个自定义的广播
9. 发送有序广播:sendOrderedBroadcast();这样发送的就是有序广播,在清单文件中的过滤器中设置的权限越大(如android:priority="100"),就优先接收到广播,接收到广播后终止广播:`abortBroadcast();`
10. 本地广播:为了安全性,发出的广播只能在程序内部传递,其他应用程序无法接收到广播,也无法接收到其他程序发送的广播
- 通过LocalBroadcastManager来发送广播和注册广播接收者
Intent intent = new Intent("com.evan.broadcasttest.MY_BROADCAST");
// sendBroadcast(intent);
LocalBroadcastManager localBroadcastManager = LocalBroadcastManager.getInstance(this);
localBroadcastManager.sendBroadcast(intent);
注册广播接收器
IntentFilter intentFilter = new IntentFilter();
intentFilter.addAction("com.evan.broadcasttest.MY_BROADCAST");
localBroadcastManager.registerReceiver(myReceiver,intentFilter);
- 注意:本地广播无法通过静态注册来接收广播