简介
BroadcastReceiver的作用有些类似全局的事件监听器,当整个手机的某一个APP或者手机自身触发事件,BroadcastReceiver接受并且处理,而且这种信号程序自身也可以创建。
创建
创建BroadcastReceiver:

当BroadcastReceiver接受到全局的信号的时候就是回调onReceive方法,为了使
BroadcastReceiver能够正常的工作还要制定Intent
指定Intent
- 代码指定
private MyReceiver mMyReceiver;
private IntentFilter mIntentFilter;
mIntentFilter = new IntentFilter("haotianyi.win.start");
mMyReceiver = new MyReceiver();
registerReceiver(mMyReceiver, mIntentFilter);//核心方法,还要取消注册
- 在AndroidManifest中使用intent-filter标签指定Intent

发送广播
Intent intent = new Intent();
intent.setAction("haotianyi.win.start");
sendBroadcast(intent);
在onReceive方法中有这样一句话:
@Override
public void onReceive(Context context, Intent intent) {
System.out.println("收到");
}

详细介绍
BroadcastReceiver有两种形式一种是有序广播也就是在接受的时候是按照顺序来接受的,高优先级先接受广播,而且可以中断广播和向广播中添加数据;另一种就是无序广播,当广播发出的时候所有的广播都可以接受,而且是同时接受的的,区别是两者的发送广播的方法不同。
有序广播
使用sendOrderedBroadcast来发送广播,也就是一种特殊的Intent(意图),中断广播的方法:abortBroadcast可以中断广播的继续发送。
广播的优先级是使用AndroidManifest中的priority属性,注意这个属性是放在intent-filter中的:

在上面的例子中在建立一个Broadcast,注意要使用sendOrderedBroadcast

传递数据
在不同的优先级中的广播传递数据:
更改MyService的onReceive方法:
@Override
public void onReceive(Context context, Intent intent) {
System.out.println("收到");
Bundle bundle = new Bundle();
bundle.putString("nihao","你好");
setResultExtras(bundle);
// abortBroadcast();
}
然后在更改MyService2的onReceive方法:
@Override
public void onReceive(Context context, Intent intent) {
Bundle hello = getResultExtras(true);
System.out.println("收到22"+"---------"+hello.get("nihao"));
}
打印截图:

注意两对方法: setResultExtras(bundle)和getResultExtras(true)
实战-短信拦截
注意这是在6.0版本之前的代码,6.0之后还要更多的权限(暂时不讨论)
首先就是把MyService能够接受系统的广播:

权限设置成最大的整数,然后在添加权限:

这时更改onService中的代码:
@Override
public void onReceive(Context context, Intent intent) {
System.out.println("收到");
// Bundle bundle = new Bundle();
// bundle.putString("nihao","你好");
// setResultExtras(bundle);
abortBroadcast();
}
这时当手机接受短信的是就完成拦截了

读取短信内容
Object[] objects = (Object[]) intent.getExtras().get("pdus");
for (Object object : objects) {// 短信最多140字节,
// 超出的话,会分为多条短信发送,所以是一个数组,因为我们的短信指令很短,所以for循环只执行一次
SmsMessage message = SmsMessage.createFromPdu((byte[]) object);
String originatingAddress = message.getOriginatingAddress();// 短信来源号码
String messageBody = message.getMessageBody();// 短信内容
System.out.println(originatingAddress + ":" + messageBody);
}
当再次接受短信:

无序广播
就是正常广播,使用方法就是sendBroadcast方法不同,二期不能中断广播;
作为一个全局的“监听者”,系统在很多任务都会发出广播,而且利用这个广播也可以作为跨进程通信的手段。
实例-开机自动启动
添加一个action:

然后在添加一个权限:

最后更改代码:
@Override
public void onReceive(Context context, Intent intent) {
System.out.println("开机自动启动成功");
}

实战-手机电量过低
一个action:

一个权限:

一个结果:
