静态注册与动态注册

添加三个个自定义广播接收者的类

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会被执行两次。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值