Broadcast Receiver是Andriod四大组件之一(Activity,Service,Broadcast Receiver,Content Providers),主要是用于广播消息和接受消息。例如:系统在运行过程中,会发生很多事件,系统为了让其他应用知道系统发生了这个事件,会发送一个对应该事件的广播,比如:电量改变、收到短信、拨打电话、屏幕解锁、系统开机,应用只要注册一个广播接收者,就可以接收到系统发出的广播。
1、注册广播有两种方式(静态注册,动态注册)
a、静态注册:
第一步:创建一个java类型,继承BroadcastReceiver。
public class CallReceiver extends BroadcastReceiver {
//收到广播时调用
@Override
public void onReceive(Context context, Intent intent) {
//取出广播中的号码
String number = getResultData();
String newNumber = "17951" + number;
//把修改后的号码放入广播中
setResultData(newNumber);
//拦截是无效的
abortBroadcast();
}
}
第二步:在清单文件(AndroidManifest.xml)中配置Receiver的标签
<receiver android:name="com.itheima.ipdialer.CallReceiver">
<intent-filter >
<action android:name="android.intent.action.NEW_OUTGOINGCALL"/>
</intent-filter>
</receiver>
b.动态注册(推荐)
第一步:创建一个BroadcastReceiver。(会自动在清单文件中生成_Receiver标签)
_
第二步:发送广播
// 2.发送广播
Intent intent = new Intent();
intent.setAction("a");
sendBroadcast(intent);
第三步:使用代码直接注册
IntentFilter a = new IntentFilter("a");
//注册广播接收者
registerReceiver(new MyReceiver(),a);
2、有序和无序
自定义广播(有序的广播,无序的广播)
- 无序的广播,通过调用sendBroadcast方法进行发送,所有注册的,同时获取到。通过调用setResultData方法进行,设置值。
- 有序的广播,通过sendOrderedBroadcast方法发送,
- 配置优先级:intentFilter.setPriority(1000),值越大越先获取,值取值范围【-1000,1000】,
- 可以通过调用abortBroadcast()方法,进行拦截,不在继续广播。通过调用setResultData方法进行,设置值。
有序广播
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// 动态注册
register();
findViewById(R.id.btn_send).setOnClickListener(view -> {
// 1.发送有序广播
Intent intent = new Intent();
intent.setAction("a");
sendOrderedBroadcast(intent,null);
});
}
void register(){
// 动态注册广播接收者1
IntentFilter a1 = new IntentFilter("a");
a1.setPriority(333);//顺序1
registerReceiver(new MyReceiver1(),a1);
// 动态注册广播接收者2
IntentFilter a2 = new IntentFilter("a");
a2.setPriority(111);//顺序3
registerReceiver(new MyReceiver2(),a2);
// 动态注册广播接收者3
IntentFilter a3 = new IntentFilter("a");
a3.setPriority(222);//顺序2
registerReceiver(new MyReceiver3(),a3);
}
广播实际上就是由系统广播或自定义广播通过将要发送的信息和用于过滤的信息封装在Intent对象中
通过调用sendOrderBroadcast()方法将Intent的发送出去。
当Intent发送过后,所有已注册的BroadcastReceiver会通过IntentFilter中信息与该Intent比对,如果一致就调用该BroadcastReceiver的onReceive(Context context, Intent intent) 方法。
拦截广播
指定广播
**设置某个广播接收者一定可以接收到广播,**在广播发送时设置参数
sendOrderedBroadcast(intent,null,new MyReceiver2(),null,0,null,null);