添加三个个自定义广播接收者的类
public class MyReceiver1 extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
Log.i("hzx", "自定义的广播接收者MyReceiver1,接收到了广播事件");
}
}
public class MyReceiver2 extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
Log.i("hzx", "自定义的广播接收者MyReceiver2,接收到了广播事件");
}
}
public class MyReceiver3 extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
Log.i("hzx", "自定义的广播接收者MyReceiver3,接收到了广播事件");
}
}
清单文件中静态注册广播接收者
<receiver
android:name=".MyReceiver3"
android:enabled="true"
android:exported="true">
<intent-filter android:priority="100">
<action android:name="hzx Broadcast"/>
</intent-filter>>
</receiver>
<receiver
android:name=".MyReceiver2"
android:enabled="true"
android:exported="true">
<intent-filter android:priority="200">
<action android:name="hzx Broadcast"/>
</intent-filter>>
</receiver>
<receiver
android:name=".MyReceiver1"
android:enabled="true"
android:exported="true">
<intent-filter android:priority="300">
<action android:name="hzx Broadcast"/>
</intent-filter>>
</receiver>
在MainActivity中onCreate()中进行动态注册
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
IntentFilter intentFilter=new IntentFilter();
intentFilter.addAction("hzx Broadcast");
mMyReceiver1 = new MyReceiver1();
mMyReceiver2 = new MyReceiver2();
mMyReceiver3 = new MyReceiver3();
registerReceiver(mMyReceiver3,intentFilter);
registerReceiver(mMyReceiver1,intentFilter);
registerReceiver(mMyReceiver2,intentFilter);
}
重写onDestroy()函数
protected void onDestroy() {
super.onDestroy();
unregisterReceiver(mMyReceiver1);
unregisterReceiver(mMyReceiver2);
unregisterReceiver(mMyReceiver3);
}
在布局文件中设置了一个发送广播点击事件
android:onClick="send"`
public void send(View view){
Log.v("hzx","send");
Intent intent = new Intent();
// 定义广播的事件类型
intent.setAction("hzx Broadcast");
// intent.setComponent(new ComponentName("com.example.ch15","com.example.ch15.MyReceiver1"));
// intent.setComponent(new ComponentName("com.example.ch15","com.example.ch15.MyReceiver2"));
// intent.setComponent(new ComponentName("com.example.ch15","com.example.ch15.MyReceiver3"));
// intent.setPackage("com.example.ch15");
// 发送广播
sendOrderedBroadcast(intent,null);
}
注意这里并没有使用setPackage()方法或者是setComponent()方法进行接收广播
然后运行程序,查看结果:
发送一个广播,广播接收者会处理两次
一次为静态注册优先级顺序,一次为动态注册向后顺序,与上课的实验结果不同
查找资料后了解到在Android8之前对于广播接收者没有严格限制,而我用于测试的手机Android版本为7.1.2.。在Android8以前版本中静态注册不需要使用setPackage()方法或者是setComponent()方法进行接收广播。
**
结论:
动态注册和静态注册可以同时进行,简单来说就是使用一个Receiver分别在AndroidManifast中进行注册,又写入在程序中用代码注册(无论Action是否相同),两种注册方式不会造成影响。动态注册只会在程序存在时执行,静态注册一直执行。哪怕是完全相同的Receiver。即如果程序存在,该Receiver会被执行两次。