BroadcastReceiver

1.BroadcastReceiver机制

Android广播分为两个方面:广播发送者和广播接收者,通常情况下,BroadcastReceiver指的就是广播接收者(广播接收器)。

广播作为Android组件间的通信方式,可以使用的场景如下:
1.同一app内部的同一组件内的消息通信(单个或多个线程之间);
2.同一app内部的不同组件之间的消息通信(单个进程);
3.同一app具有多个进程的不同组件之间的消息通信;
4.不同app之间的组件之间消息通信;
5.Android系统在特定情况下与App之间的消息通信。

2.BroadcastReceiver类型

标准广播和有序广播

标准广播,广播发出后,所有广播接收器几乎同时收到广播,几乎没有任何先后顺序而言。因此它也不能被截断。

sendBroadcast(intent);

有序广播,广播发出后,只有一个广播接收器收到该广播。当这个广播接收器的逻辑执行完毕之后,再向下传递。所以此时的广播接收器是有优先级顺序的。

 sendOrderedBroadcast(intent, null);  

参数2,是一个权限,可为null,也可以自己做一个权限。

3.BroadcastReceiver的生命周期:

BroadcastReceiver的生命周期,从对象调用它开始,到onReceiver方法执行完成之后结束。另外,每次广播被接收后会重新创建BroadcastReceiver对象,并在onReceiver方法中执行完就销毁,如果BroadcastReceiver的onReceiver方法中不能在10秒内执行完成,Android会出现ANR异常。所以不要在BroadcastReceiver的onReceiver方法中执行耗时的操作。

如果需要在BroadcastReceiver中执行耗时的操作,可以通过Intent启动Service来完成。但不能绑定Service。

特别是,您可能无法从一个BroadcastReceiver中显示一个对话框,或绑定到服务。对于前者,则应该使用NotificationManager的API。对于后者,你可以使用Context.startService()来启动一个Service。

4.BroadcastReceiver两种注册方式
静态注册,标准广播,接收器用action来辨别接收的广播。

<receiver 
    android:name=".MyReceiver">  
    <intent-filter>  
        <action android:name="android.intent.action.MY_BROADCAST"/>  
    </intent-filter>  
</receiver> 

静态注册 ,有序广播

 <!--优先级的设定 FirstBroadcastReceiver大于SecondBroadcastReceiver,优先级的范围-1000~1000 -->  
<receiver android:name=".FirstBroadcastReceiver">
    <intent-filter android:priority="200">
        <action android:name="android.intent.action.OrderedBroadcastReceiver"/>
        <category android:name="android.intent.category.DEFAULT"/>
    </intent-filter>
</receiver>

动态注册,标准广播

MyBroadcastReceiver receiver=new MyBroadcastReceiver();
IntentFilter filter=new IntentFilter();
filter.addAction("android.provider.Telephony.SMS_RECEIVED");

registerReceiver(myBroadcastReceiver, filter);

动态注册,有序广播

FirstBroadCast firstBroadCast=new FirstBroadCast();
IntentFilter filter1 = new IntentFilter();  
filter1.addAction(MY_BROADCAST_ACTION);  
filter1.setPriority(1000);  

registerReceiver(firstBroadCast, filter1);  

5.BroadcastReceiver应用实例:

6.Local Broadcast:App应用内广播(此处的App应用以App应用进程为界)

Android中的广播可以跨进程甚至跨App直接通信,且注册是exported对于有intent-filter的情况下默认值是true,由此将可能出现安全隐患如下:

1.其他App可能会针对性的发出与当前App intent-filter相匹配的广播,由此导致当前App不断接收到广播并处理;

2.其他App可以注册与当前App一致的intent-filter用于接收广播,获取广播具体信息。

无论哪种情形,这些安全隐患都确实是存在的。由此,最常见的增加安全性的方案是:

1.对于同一App内部发送和接收广播,将exported属性人为设置成false,使得非本App内部发出的此广播不被接收;
2.在广播发送和接收时,都增加上相应的permission,用于权限验证;
3.发送广播时,指定特定广播接收器所在的包名,具体是通过intent.setPackage(packageName)指定在,这样此广播将只会发送到此包中的App内与之相匹配的有效广播接收器中。
App应用内广播可以理解成一种局部广播的形式,广播的发送者和接收者都同属于一个App。实际的业务需求中,App应用内广播确实可能需要用到。同时,之所以使用应用内广播时,而不是使用全局广播的形式,更多的考虑到的是Android广播机制中的安全性问题。
相比于全局广播,App应用内广播优势体现在:
1.安全性更高;
2.更加高效。
为此,Android v4兼容包中给出了封装好的LocalBroadcastManager类,用于统一处理App应用内的广播问题,使用方式上与通常的全局广播几乎相同,只是注册/取消注册广播接收器和发送广播时将主调context变成了LocalBroadcastManager的单一实例。

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值