问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

如何在动态配置的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说的,他们分布在各自的注册区域最多有效注册为第一次, 重复注册无效 ;
转载仅供参考,版权属于原作者
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
立秋后钓鱼什么风向好-立秋钓鱼风向怎么选 赱乂砉込儬 怎么读 "赱"读什么? 解决电脑无法搜索到iPhone热点的问题如何修复iPhone热点无法在电脑上显... 电脑搜不到iphone12热点 iphone开热点给电脑搜不到 国企的地产有哪些 国企下设公司是什么意思? 红加蓝加绿是什么色. 梦幻西游75级开三倍抓鬼一轮有多少经验 android静态注册监听系统广播,如何只让本工程能够使用? 如何判断android 短信发送是否成功 多个Activity发送广播的问题!!!求解 推送消息时,单播可以收到,广播收不到怎么办 RDS(RADIO DATA SYSTEM)是否在中国和其他国家已经注册商标? 如何判断路由器是否开了广播 android中的广播是什么意思 怎么判断手机按键是否能接收到广播 android怎么判断广播已注册 怎么判断 android 广播是否注册过 Android中怎么判断一个BroadcastReceiver是否已经注册 android 广播怎么判断是否已注册 OPPO R9sQQ微信已加密怎么取消? oppor9s怎样解除微信的应用加密 OPPO9s的微信加密,怎么取消, oppor9s微信加密怎么解除 OPPOr9s微信加密怎么取消 并列关系的成语 什么是联合式成语 谁能帮忙说出几个表示并列关系的四字词语:例:风霜雨雪! Android 动态广播 和 静态广播的区别 怎么根据帧头中的MAC地址判断广播还是单播 心肌缺血患者,在饮食上应该注意什么?有哪些禁忌? 心肌缺血就是我们常说的心脏供血不足,心肌缺血饮食方面应该注意些什么? 胸痛,心肌缺血,在日常生活中应该注意哪些方面? 心肌缺血平时应注意什么 心肌缺血应注意哪些 心肌缺血要注意什么好 心肌缺血平时应该怎样保养,饮食有什么注意的? 心肌缺血应该注意什么? 心肌缺血的人群,在日常生活中都有哪些注意事项? 心肌缺血患者该如何治疗?日常该注意什么? 心肌缺血要注意哪些方面的问题 心肌缺血的饮食注意事项都是什么? 心肌缺血 在饮食运动等日常生活中要注意什么? 心肌缺血病注意什么 心肌缺血平时应该注意什么 的心肌缺血,平时饮食应该注意什么 胸痛,心肌缺血,在日常生活中应该注意什么? 心肌缺血生活上要注意什么?