BroadcastReceiver 概述上一篇参考:https://blog.csdn.net/whjk20/article/details/113182525
以下为简单学习的例子。
目录
1. 创建接收器, 继承 BroadcastReceiver
一、 接收器
1. 创建接收器, 继承 BroadcastReceiver
public class MyBroadcastReceiver1 extends BroadcastReceiver {
private final static String TAG = "MyBroadcastReceiver1";
private void log(String msg) {
Log.d(TAG, msg);
}
public MyBroadcastReceiver1() {
log("constructor");
}
@Override
public void onReceive(Context context, Intent intent) {
String action = intent.getStringExtra("action");
log("onReceive action=" + action);
}
}
public class MyBroadcastReceiver2 extends BroadcastReceiver {
private final static String TAG="MyBroadcastReceiver2";
private void log(String msg) {
Log.d(TAG, msg);
}
public MyBroadcastReceiver2() {
log("constructor");
}
@Override
public void onReceive(Context context, Intent intent) {
String action = intent.getStringExtra("action");
log("onReceive action=" + action);
if(isOrderedBroadcast()) { //注意判断,否则会抛异常
//abortBroadcast();
//log("onReceive abortBroadcast" );
}
log("onReceive done" );
}
}
public class MyBroadcastReceiver3 extends BroadcastReceiver {
private final static String TAG="MyBroadcastReceiver3";
private void log(String msg) {
Log.d(TAG, msg);
}
public MyBroadcastReceiver3() {
log("constructor");
}
@Override
public void onReceive(Context context, Intent intent) {
String action = intent.getStringExtra("action");
log("onReceive action=" + action);
}
}
其中MyBroadcastReceiver2 可以中断广播。
2. 注册广播接收器
(1 )MyBroadcastReceiver1、MyBroadcastReceiver2 使用静态方式注册
并且MyBroadcastReceiver2 设置优先级为 50
<receiver android:name=".MyBroadcastReceiver1">
<intent-filter>
<action android:name="com.example.broadcastreceiverpart.MyBroadcastReceiver1.action1" />
</intent-filter>
</receiver>
<receiver android:name=".MyBroadcastReceiver2" >
<intent-filter android:priority="50">
<action android:name="com.example.broadcastreceiverpart.MyBroadcastReceiver1.action1"/>
</intent-filter>
</receiver>
(2) MyBroadcastReceiver3使用动态注册, 其中在Activity 的onCreate 注册, 在Activity 的onDestroy 中解注册。
private MyBroadcastReceiver3 myBroadcastReceiver3;
private void register() {
if (myBroadcastReceiver3 == null) {
Intent intent = new Intent(this, MyBroadcastReceiver3.class);
myBroadcastReceiver3 = new MyBroadcastReceiver3();
IntentFilter intentFilter = new IntentFilter("com.example.broadcastreceiverpart.MyBroadcastReceiver1.action1");
registerReceiver(myBroadcastReceiver3, intentFilter);
log("register done");
} else {
log("register return because it is already registered");
}
}
private void unregister() {
if(myBroadcastReceiver3 !=null) {
unregisterReceiver(myBroadcastReceiver3);
myBroadcastReceiver3 = null;
log("unregister done");
} else {
log("unregister return because it is not register");
}
}
二、广播(发送广播)
1. 一般广播
public void sendBroadcast(View view) {
log("sendBroadcast start");
Intent intent = new Intent("com.example.broadcastreceiverpart.MyBroadcastReceiver1.action1");
intent.putExtra("action", "no order");
intent.setPackage("com.example.broadcastreceiverpart");
sendBroadcast(intent);
log("sendBroadcast end");
}
2. 有序广播
public void sendOrderBroadcast(View view) {
log("sendOrderBroadcast start");
Intent intent = new Intent("com.example.broadcastreceiverpart.MyBroadcastReceiver1.action1");
intent.putExtra("action", "with order");
intent.setPackage("com.example.broadcastreceiverpart");
sendOrderedBroadcast(intent, null);
log("sendOrderBroadcast end");
}
}
其中这里两个方法是响应两个Button 的onClick 操作,可以忽略View view 这个参数。
三、注意事项
1. 静态注册广播, 发送一般广播后,无法收到的问题。 例如报错: Background execution not allowed: receiving Intent
解决方法: (原因为隐式发送), 改为显式发送,即在发送广播前,为intent 设置包名: intent.setPackage("com.example.broadcastreceiverpart");
2. 静态注册,每次接收到,都会重现创建一个BroadcastReceiver 的实例对象,使用完后销毁
2021-01-26 10:43:18.690 23603-23603/com.example.broadcastreceiverpart D/MyBroadcastReceiver1: constructor
2021-01-26 10:43:18.691 23603-23603/com.example.broadcastreceiverpart D/MyBroadcastReceiver1: onReceive action=no order
2021-01-26 11:02:06.945 25259-25259/com.example.broadcastreceiverpart D/MyBroadcastReceiver1: constructor
2021-01-26 11:02:06.946 25259-25259/com.example.broadcastreceiverpart D/MyBroadcastReceiver1: onReceive action=no order
3. 发送一般广播时,对于同个action, intent-filter设置的优选级高(android:priority数值大)先收到,
如果都没有设置priority 则接收顺序跟注册的顺序有关(Android manifest)
4. 发送有序广播时,优选级高的先收到,并且可以中断广播。
MyBroadcastReceiver2 中
@Override
public void onReceive(Context context, Intent intent) {
...
if(isOrderedBroadcast()) { //注意判断,否则会抛异常
abortBroadcast();
log("onReceive abortBroadcast" );
}
}
2021-01-26 11:16:35.606 28445-28445/com.example.broadcastreceiverpart D/MyBroadcastReceiver2: constructor
2021-01-26 11:16:35.607 28445-28445/com.example.broadcastreceiverpart D/MyBroadcastReceiver2: onReceive action=no order
2021-01-26 11:16:35.607 28445-28445/com.example.broadcastreceiverpart D/MyBroadcastReceiver2: onReceive abortBroadcast
MyBroadcastReceiver1 则不会收到。
并且需要判断isOrderedBroadcast(), 然后才调用abortBroadcast, 否则会抛出异常 (非有序广播 使用了 中断之类的)