如何在动态配置的broadcastreceiver里接收到action
发布网友
发布时间:2022-04-23 23:14
我来回答
共1个回答
热心网友
时间:2022-04-10 17:36
1.自定义一个广播处理者
//如果广播事件处理类是一个内部内的话,一定要声明为static的;如果还要注册为自定义广播那么要在主配置文件中receiver android:name声明格式为**.**.**.父类$当前类
public class MyCustomReceiver extends BroadcastReceiver{
//处理广播
@Override
public void onReceive(Context context, Intent intent) {
//接收广播进行处理
String cmdAction=intent.getAction();//获取当前广播的action
if("cn.android.app.current_weather".equals(cmdAction)){
String getValue=intent.getStringExtra("weatherState");//获取当前广播的data ;
System.out.println("广播接受成功,当前的传递的信息是:"+getValue);
}
}
}
使用自己的广播,可以在主配置文件xml中使用receiver标签(注册处理广播的BroadcastReceiver类)和子标签intent-filter(需要action 属性来过滤广播,以便接受广播时能获取对应的那个广播)标签进行广播的静态注册,然后在代码中只需要发送广播就可以了,程序会自己去寻找主配置文件中所配置的对应广播的处理者;
在代码中发送自定义广播后,系统除了会自动调用对应(action一致)的在主配置文件中使用receiver标签注册广播的广播处理类,还会调用在发送广播之前,其他通过代码注册了广播的处理者 ;一般对于自定义广播的处理者,一般就一个,多是使用主配置文件静态注册广播处理者来处理广播.
(无论是在代码中还是在主配置文件中,我们都可以注册多个广播处理者以共同接受处理广播,不过无论在那个地方注册,同一广播处理者在所在注册区域,只能有效注册一次,重复不会报错,只是无效).
使用自定义一个广播处理者可以在主配置文件中进行静态注册,那么在发送广播之后,广播处理者就能接收到广播了,而且这种形式是伴随着整个应用的生命周期(如果这种方式处理的广播是系统广播的话,那么不管应用程序是否开启,该广播处理者都能进行对广播的处理),不像代码那样只会伴随着context(一般是指activity和Service)的生命周期;
广播处理者(receiver)注册+广播过滤器声明(intent-filter) ,在主配置文件中使用<receiver 标签需要使用它的子标签 <intent-filter>不然毫无意义;
<!-- 注册广播 -->
<receiver android:name="MyCustomReceiver">
<intent-filter>
<action android:name="cn.android.app.current_weather"/>
</intent-filter>
</receiver>
注意:
(1) , 其实对于自定义的广播的处理,也完全可以不在主配置文件中进行如上注册,只要我们在发送自定义广播之前,进行了广播处理者的注册(注册后要在生命周期结束时,卸载广播,不然会报错),那么在发送自定义广播后依然能够处理到广播。
(不过代码注册的对于自定义广播的处理和在主配置文件中的静态注册区别是不能伴随整个应用程序,只能是所在context(一般是指activity和Service)的生命周期;还有,自定义广播中的action可以随便定义,只要注册和发送广播时使用的是一致的,那么就能实现对广播事件的处理);
(2) , 在主配置文件中进行对广播事件处理者的静态注册,一般是两个原因 :
1,不管在所在程序是否开启都要处理系统广播 ;
2,免去了在代码需要事先注册的情况,在代码中只需发送广播就可以对广播的进行处理,且这种广播处理者的生命周期是伴随整个应用程序(自定义广播)或者整个系统(系统广播) ;
所以是否通过主配置文件注册广播处理者,还是根据需求来定.
2.发送广播
发送广播一般由两部分组成:1:action (指定为是那种广播); 2:data (指定广播的信息);其中第一个是成功发出广播所必须要的;
代码实例
类型和解说
// 1:实例化一个Intent对象
Intent intent = new Intent();
// 2:添加广播的action
intent.setAction(Intent.ACTION_EDIT);
// 3:调用sendBroadcast把广播发送出去
sendBroadcast(intent);
(1)发送系统广播
如果在主配置文件中通过<receiver声明了一个广播处理类,且在<intent-filter>标签里面引用了对应的系统广播的话
(对应下面发送广播的intent-filter action的是"android.intent.action.EDIT"),那么在系统广播发出之后(这里通过代码发送系统广播),系统就会自动发送广播给那个广播处理类;
// 1:实例化一个Intent对象
Intent intent = new Intent();
// 2:添加广播的action,action的值是自定义的;
intent.setAction("cn.android.app.current_weather");
//3.添加发送广播的data,以便处理者针对对应的广播处理,有数据可以使用;
intent.putExtra("weatherState", "哈哈");
//4:调用sendBroadcast把广播发送出去
sendBroadcast(intent);
(2)发送自定义的广播
3.动态注册广播处理者
动态注册广播处理者,也就是通过代码注册广播处理者,它的生命周期伴随着context(一般是指activity和Service);
如果注册的广播处理者只需要在程序运行片段的时候去处理广播,不需要在主配置文件中进行静态注册的话,就如下,直接通过代码注册广播处理者;
代码实例
类型和解说
//创建Intent过滤器实例
IntentFilter intentFilter=new IntentFilter();
//给过滤器设置相应的action
intentFilter.addAction(Intent.ACTION_MEDIA_MOUNTED);
intentFilter.addAction(Intent.ACTION_MEDIA_UNMOUNTED);
intentFilter.addAction(Intent.ACTION_MEDIA_REMOVED);
intentFilter.addAction(Intent.ACTION_BATTERY_CHANGED);
intentFilter.addAction(Intent.ACTION_BOOT_COMPLETED);
//intentFilter.addAction(Intent.action_Me)
//注册挂载广播
MReceiver mReceiver=MReceiver();
registerReceiver(mReceiver, intentFilter);
//卸载广播
unregisterReceiver(mReceiver);
(1).注册接受系统广播的广播处理类;
// 创建Intent过滤器实例
IntentFilter intentFilter = new IntentFilter();
// 给过滤器设置相应的action
intentFilter.addAction("cn.android.app.current_weather");
//注册挂载广播
MReceiver mReceiver=MReceiver();
registerReceiver(mReceiver, intentFilter);
//卸载广播
unregisterReceiver(mReceiver);
(2).注册接受自己的广播的广播处理类;
4.静态注册广播处理者
静态注册也就是在主配置文件中进行的对于广播的处理者的注册,它的形式:需要通过receiver声明广播处理者,intent-filter action声明所要处理的广播。
如果一个广播处理者不管所归属的程序是否开启都要处理系统广播的话,那么需要在主配置文件里面进行注册,这种静态注册的主要是针对于系统广播的处理者,它的生命周期将会伴随整个系统。
注意:
若在主配置文件中静态注册的是自定义广播处理类,那么在代码中发送了自定义的广播后,系统会自动发送广播到注册广播时的广播处理者,这种对于自定义广播的处理者的静态注册,它的生命周期是整个应用程序。
BroadcastReceiver广播处理者静态注册
<!-- 注册广播,广播的action可以是系统的如:android.intent.action.EDIT ,也可以是自己的 . -->
<receiver android:name="MyCustomReceiver1">
<intent-filter>
<action android:name="广播的action"/>
</intent-filter>
</receiver>
值的一提的是:
<!-- 可以多个广播处理者注册同一个广播(包括自定义广播),都能监听到,不过同一个广播处理者重复注册一个广播无效,仍然只被视为一个,如下在上面注册了某种广播的处理者基础上,进行了针对同一种广播的另外一个处理者的注册 -->
<receiver android:name="MyCustomReceiver2">
<intent-filter>
<action android:name="广播的action"/>
</intent-filter>
</receiver>
总结:
1,在代码中如果注册了BroadcastReceiver,那么在关闭context(一般是指activity和Service)时一定要在onDestroy方法里或context消亡之前卸载注册,还有卸载注册前一定要先注册,不然都会报错,可以通过一个flag来标记注册或者卸载;
2,在代码中或者主配置文件中重复使用一个BroadcastReceiver注册同一个广播不会报错,只是,重复注册无效(比如在代码中,不管重新实例化多少次,只要所使用的广播处理对象是同一个BroadcastReceiver类),仍然视为只注册了一次,无论是代码中还是主配置文件中 ;
3.在代码中或者主配置文件中重复使用一个BroadcastReceiver注册接收多个不同的广播是可以的,在BroadcastReceiver注册时所指向的这些广播被发出后,BroadcastReceiver都能收到,不过要在BroadcastReceiver中需要根据action判断当前收到的何种广播然后进行分别处理 ;
(代码中重复使用IntentFilter的addAction方法,或者重新实例化IntentFilter再addAction然后注册到广播去 ;
同理主配置文件中重复使用<intent-filter>的<action标签 或者重新开辟一个<receiver然后再使用中<intent-filter>的<action标签)
4,若是使用同一个广播处理类在代码中和主配置文件中分别进行注册,那么在广播发出后,该广播处理类会处理两次广播 ,不过像前面注意2说的,他们分布在各自的注册区域最多有效注册为第一次, 重复注册无效 ;
转载仅供参考,版权属于原作者