BroadcastReceiver是 广播接收者的意思,既然是接收者,那就肯定有发送者,发送者其实就是android系统,我们开发者使用BroadcastReceiver就能接收到系统发送出来的广播。比如,手机开机会发出一个广播,开启屏幕会发出一个广播,息屏会发出一个广播,来电话,打电话,来短信,发送短信,等等这些都会发送一个广播,我们都可以使用BroadcastReceiver来接收,然后根据业务需求在接收到这些广播之后做一些操作。
广播注册
注册广播有两种方式
静态注册:在清单文件配置intent-filterr—>意图过滤器
动态注册:在代码中调用registerReceiver注册
接收系统广播
- 定义一个类AppStateReceiver,继承BroadcastReceiver
- 在Application中或者Activity中动态注册广播接收者
- 在自定义的广播接收者类的onReceive方法中接收数据
例如注册一个监听应用程序安装和下载的广播接收者
第一步
public class AppStateReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
Log.d("AppStateReceiver","接收到广播了");
String action = intent.getAction();
Uri data = intent.getData();
if ("android.intent.action.PACKAGE_INSTALL".equals(action)){
Log.d("AppStateReceiver","应用安装:INSTALL"+data);
}else if("android.intent.action.PACKAGE_ADDED".equals(action)){
Log.d("AppStateReceiver","应用安装:ADDED"+data);
}else if("android.intent.action.PACKAGE_REMOVED".equals(action)){
Log.d("AppStateReceiver","应用卸载:REMOVED"+data);
}
}
}
第二步
AppStateReceiver appStateReceiver = new AppStateReceiver();
IntentFilter appStateIntentFilter = new IntentFilter();
appStateIntentFilter.addAction("android.intent.action.PACKAGE_INSTALL");//这个没用,
appStateIntentFilter.addAction("android.intent.action.PACKAGE_ADDED");//安装
appStateIntentFilter.addAction("android.intent.action.PACKAGE_REMOVED");//卸载
appStateIntentFilter.addAction("android.intent.action.PACKAGE_REPLACED");//新版本
appStateIntentFilter.addDataScheme("package");
registerReceiver(appStateReceiver,appStateIntentFilter);
接收自定义无序广播
接收自定义广播和接收系统广播一样,区别就是action是自定义的
第一步定义一个自定义广播接收者
public class CustomReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
String sendReceive = intent.getStringExtra("sendReceive");
Log.d("CustomReceiver",sendReceive);
}
}
第二步注册广播
// 1. 实例化BroadcastReceiver子类 & IntentFilter
CustomReceiver customReceiver = new CustomReceiver();
IntentFilter intentFilter = new IntentFilter();
// 2. 设置接收广播的类型
intentFilter.addAction("com.longteng.cn");// 只有持有相同的action的接受者才能接收此广播
// 3. 动态注册:调用Context的registerReceiver()方法
registerReceiver(customReceiver, intentFilter);
第三步创建一个新的应用发送广播
创建一个应用,写一个点击事件,执行下面的方法就行了
public void sendReceive(View view) {
Intent intent = new Intent();
intent.setAction("com.longteng.cn");
intent.putExtra("sendReceive","发送无序广播");
//下面这行是指定发送到哪个包名,如果是静态注册的广播接收者,就需要指定包名
// intent.setPackage("com.longteng.learndemo");
sendBroadcast(intent);
Log.d("sendReceive","点击了发送广播");
}
接收自定义有序广播
有序广播是指,一个应用接收多次同一个广播可以按照一定的级别顺序接收广播。
- 需要发送一个有序广播
- 多个广播接收者,级别不同
下面是具体实现
发送广播代码
Intent intent = new Intent();
intent.setAction("com.longteng.orderReceive");
// 第一个参数Intent类型,就是意图
// 第二个参数String,设置一个权限
// 第三个参数BroadcastReceiver类型,
// 是一个最终的广播接收者,就是指定最后一个收到广播的,
// 这个这个广播接收者就不需要注册了
// 并且这个广播接收者不管中间是否有被终止操作,都能收到数据
// 第四个参数Handler类型
// 第五个参数int类型,设置一个初始码
// 第六个参数String类型,设置一个初始数据
// 第七个参数Bundle类型
// sendOrderedBroadcast(intent,null,null,null,1,"initialData100",null);
sendOrderedBroadcast(intent,null,new FinalReceive(),null,1,"initialData100",null);
发送广播的时候第三个参数可以指定一个最终的广播接收者,也可以不指定,我这里就是定义了一个最简单的广播接收者
public class FinalReceive extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
Log.d(this.getClass().getName(),getResultData());
}
}
发送就完成了,下面看接收,我定义了三个接收广播的类
public class AcceptOrderReceiveFirst extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
//打印接收到的数据
Log.d(this.getClass().getName(),getResultData());
//修改数据
setResultData("first->update->initialData80");
}
}
public class AcceptOrderReceiveMiddle extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
Log.d(this.getClass().getName(),getResultData());
//修改数据
setResultData("middle->update->initialData60");
//终止广播,但是不能终止发送广播时指定的广播接收者
abortBroadcast();
}
}
public class AcceptOrderReceiveFinal extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
Log.d(this.getClass().getName(),getResultData());
}
}
定义好三个广播接收者,完成动态注册就可以了
//第一个收到的
AcceptOrderReceiveFirst acceptOrderReceiveFirst = new AcceptOrderReceiveFirst();
IntentFilter acceptFirstIntentFilter = new IntentFilter();
//设置级别,数字越大越先收到,数字范围-1000至1000,官方写的范围
acceptFirstIntentFilter.setPriority(1000);
acceptFirstIntentFilter.addAction("com.longteng.orderReceive");
registerReceiver(acceptOrderReceiveFirst,acceptFirstIntentFilter);
//第二个收到的
AcceptOrderReceiveMiddle middle = new AcceptOrderReceiveMiddle();
IntentFilter acceptMiddleIntentFilter = new IntentFilter();
acceptMiddleIntentFilter.setPriority(0);
acceptMiddleIntentFilter.addAction("com.longteng.orderReceive");
registerReceiver(middle,acceptMiddleIntentFilter);
//最后一个收到的
AcceptOrderReceiveFinal orderReceiveFinal = new AcceptOrderReceiveFinal();
IntentFilter finalIntentFilter = new IntentFilter();
finalIntentFilter.setPriority(-100);
finalIntentFilter.addAction("com.longteng.orderReceive");
registerReceiver(orderReceiveFinal,finalIntentFilter);
注销广播接收者
如果是在Activity中注册的广播接收者,可以在onDestroy里面注销广播接收者unregisterReceiver(BroadCastReceive receive)就可以了,可以防止广播泄漏。
广播接收者注意事项
- 如果是静态注册广播,发送广播的必须指定注册广播的应用的包名,这样静态注册的广播才能收到。
- 如果是动态注册广播,如果不是系统广播需要加权限的,基本都可以收到广播消息
- 所以推荐动态注册广播。
- 无序广播不能修改,不能终止
- 有序广播可以修改,可以终止
广播可以干什么
- 进程间通信,这个很明显,一个应用发送广播,另一个应用接收广播,这就是进程间通信
- 可以做一些顺序操作,因为有序广播可以指定顺序执行