使用 BroadcastReceiver&&动态注册和注销 BroadcastReceiver&&BroadcastReceiver 的优先级
0、介绍
- BroadcastReceiver也就是“广播接收者”的意思,顾名思义,它就是用来接收来自系统和应用中的广播。
- 在Android系统中,广播体现在方方面面,例如当开机完成后系统会产生一条广播,接收到这条广播就能实现开机启动服务的功能;当网络状态改变时系统会产生一条广播,接收到这条广播就能及时地做出提示和保存数据等操作;当电池电量改变时,系统会产生一条广播,接收到这条广播就能在电量低时告知用户及时保存进度,等等。
- registerReceiver(receiver, new IntentFilter(MyBReceiver.ACTIION))就会注册一个相应带着过滤器的receiver。(这里指明了action)
1、静态使用 BroadcastReceiver
- MyBReceiver 代码:
-
public class MyBReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { Log.v("receiver",intent.getStringExtra("data")); } }
- manifest代码:
-
<receiver android:name = ".MyBReceiver" android:enabled="true" android:exported="true"> </receiver>
- 发送广播:
-
Intent intent = new Intent(this,MyBReceiver.class);//无过滤器。 intent.putExtra("data", "我爱你"); sendBroadcast(intent);
2、动态注册和注销 BroadcastReceiver(通过action)
- MyBReceiver 代码:
-
public class MyBReceiver extends BroadcastReceiver { static final public String ACTIION = "com.example.learnbroadcastreceiver.content.action.MyBReceiver"; @Override public void onReceive(Context context, Intent intent) { Log.v("receiver",intent.getStringExtra("data")); } }
-
manifes不要申明了。ACTION的值随便都行,但是一般要符合大家同意的命名规则。因为registerReceiver(receiver, new IntentFilter(MyBReceiver.ACTIION))就会注册一个相应带着action的receiver。
- 发送广播:
-
Intent intent = new Intent(MyBReceiver.ACTIION);//action名称一样都是(MyBReceiver.ACTIION)的接收器都能收到。
intent.putExtra("data", "我爱你");
sendBroadcast(intent); - 注册reciever:
-
if (receiver==null) { receiver = new MyBReceiver(); registerReceiver(receiver, new IntentFilter(MyBReceiver.ACTIION)); }
- 注销reciever:
-
if (receiver!=null) { unregisterReceiver(receiver); receiver = null; }
3、BroadcastReceiver 的优先级
- action名称一样的接收都能够有权力接收到广播。但是其中优先级高的会先接收到广播。如果发送的广播属于有序广播(),那么优先级高的接收器可以利用abortBroadcast()防止广播继续向同类接收器传播。
- 发送广播代码:
-
Intent intent = new Intent(MyBReceiver.ACTIION); intent.putExtra("data", "我爱你"); sendOrderedBroadcast(intent, null);
- manifest文件:
-
<receiver android:name = ".MyBReceiver" android:enabled="true" android:exported="true"> <intent-filter android:priority="100"> <action android:name = "ssss"></action> </intent-filter> </receiver> <receiver android:name = ".MyBReceiver1" android:enabled="true" android:exported="true"> <intent-filter android:priority="99"> <action android:name = "ssss"></action> </intent-filter> </receiver>
- 两个接收器代码:
![]()
![]()
- 结果:
- 未调用abortBroadcast
![]()
- -----------------------------------------------------------------------------------------------------------------------------
- 调用了abortBroadcast
![]()





浙公网安备 33010602011771号