BroadcastReceiver的总结
来源:互联网 发布:淘宝csgo国际服 编辑:程序博客网 时间:2024/06/03 19:30
一.概述
BroadcastReceiver作为四大组件之一,对发送出来的 Broadcast 进行过滤、接收和响应。
BroadcastReceiver没有实现图形用户界面,但是当它收到消息后,可以启动Activity,Service或者通过NotificationMananger提醒用户等等作为响应。
二.应用场景
1.不同组件之间通信(包括应用内 / 不同应用之间)。
2. 与 Android 系统在特定情况下的通信(比如当电话呼入时、网络可用时)。
3. 多线程通信。
三.BroadcastReceiver的分类
四.BroadcastReceiver的使用
BroadReceiver的使用可以分为三步:注册Receiver,发送广播,接收Receiver。
BroadcastReceiver的两种注册方式:
1.静态注册:
在清单文件中为 BroadcastReceiver 进行注册,使用< receiver >标签声明,并在标签内用 < intent-filter > 标签设置过滤器。
普通广播:
(1)新建StaticReceiver.java,继承BroadcastReceiver,并实现onReceiver方法。
public class StaticReceiver extends BroadcastReceiver{ private static final String TAG = "StaticReceiver"; @Override public void onReceive(Context context, Intent intent) { Log.d(TAG, "onReceive: ");//收到消息进行处理 Intent intent1 = new Intent(context, SendActivity.class); context.startActivity(intent1); }}
(2)清单文件中注册StaticReceiver:
<receiver android:name=".StaticReceiver"> <intent-filter> <action android:name="com.liuwei.staticReceiver"/> </intent-filter> </receiver>
(3)使用sendBroadcast方法发送广播:
Intent intent = new Intent(); intent.setAction("com.liuwei.staticReceiver");sendBroadcast(intent);
其中在清单文件中设置android:priority属性可以设置优先级,值越大,优先级越高,可以发送有序广播。
<receiver android:name=".StaticReceiver"> <intent-filter android:priority="98"> <action android:name="com.liuwei.staticReceiver"/> </intent-filter> </receiver>
有序广播:
(1)新建StaticReceiver1.java,StaticReceiver2.java,StaticReceiver3.java三个类,继承BroadcastReceiver并实现onReceiver方法。
<receiver android:name=".StaticReceiver1"> <intent-filter android:priority="99"> <action android:name="com.liuwei.staticOrderReceiver"/> </intent-filter> </receiver> <receiver android:name=".StaticReceiver2"> <intent-filter android:priority="22"> <action android:name="com.liuwei.staticOrderReceiver"/> </intent-filter> </receiver> <receiver android:name=".StaticReceiver3"> <intent-filter android:priority="66"> <action android:name="com.liuwei.staticOrderReceiver"/> </intent-filter> </receiver>
其中清单文件中设置android:priority表示优先级,值越大,优先级越高。
Intent intent = new Intent(); intent.setAction("com.liuwei.staticOrderReceiver");sendOrderedBroadcast(intent, null);
(2)使用sendOrderedBroadcast(Intent intent,String receiverPermission);方法发送有序广播。
关于sendOrderedBroadcast方法中receiverPermission参数自定义权限的说明:
在清单文件中添加一个 < permission > 标签来声明自定义权限。
<permission android:name="com.example.permission.receiver" android:protectionLevel="signature" />
测试:新建两个应用,sendapp,thirdapp。在两个app中分别新建StaticReceiver1.java,StaticReceiver2.java,StaticReceiver3.java三个类,继承BroadcastReceiver并实现onReceiver方法,在清单文件中注册Receiver,其中sendapp的清单文件中加入权限,thirdapp中未加入权限。
<uses-permission android:name="com.example.permission.receiver" />
结果:只有sendapp中可以收到消息,thirdapp中不能收到消息。
(3)拦截广播:
abortBroadcast();
2.动态注册:
动态注册是在代码中通过设置 IntentFilter对象实现的,不需要在清单文件中注册 Receiver 。
(1)注册Receiver:
BroadcastReceiver receiver = new DynamicReceiver();IntentFilter intentFilter = new IntentFilter("com.liuwei.DynamicReceiver");registerReceiver(receiver, intentFilter);
(2)发送广播:
Intent intent = new Intent(); intent.setAction("com.liuwei.DynamicReceiver");sendBroadcast(intent);
(3)注销Receiver:
unregisterReceiver(receiver);
说明:
(1)对于动态广播,注册广播就必须注销广播,否则会导致内存泄露。
(2)动态广播最好在onResume()注册、onPause()注销。
因为onPause()在App死亡前一定会被执行,从而保证广播在App死亡前一定会被注销,从而防止内存泄露。
五.LocalBroadcastManager的使用
对于LocalBroadcastManager方式发送的应用内广播,只能通过LocalBroadcastManager动态注册,不能静态注册。
1.注册Receiver:
LocalBroadcastManager manager = LocalBroadcastManager.getInstance(this); LocalBroadcastManager localReceiver = new LocalReceiver(); IntentFilter intentFilter1 = new IntentFilter("com.liuwei.localManagerReceiver"); manager.registerReceiver(localReceiver, intentFilter1);
2.发送广播:
Intent intent = new Intent(); intent.setAction("com.liuwei.localManagerReceiver");manager.sendBroadcast(intent);
3.注销Receiver:
manager.unregisterReceiver(localReceiver);
LocalBroadcastManager除了能解决BroadcastReceiver进程间安全性问题外,相对Context操作的BroadcastReceiver而言还具有更高的运行效率。
六.生命周期
BroadcastReceiver 的生命周期很短,在执行 onReceiver() 方法时才有效,一旦执行完毕,该Receiver 的生命周期就结束了。
所以onReceive必须在10秒钟内执行完毕,否则会产生ANR(Application Not Response)。如果需要进行耗时的操作,可以通过启动一个Service来实现。
注意:
对于不同注册方式的广播接收器回调OnReceive(Context context,Intent intent)中的context返回值是不一样的:
对于静态注册(全局+应用内广播),回调onReceive(context, intent)中的context返回值是:ReceiverRestrictedContext;
对于全局广播的动态注册,回调onReceive(context, intent)中的context返回值是:Activity Context;
对于应用内广播的动态注册(LocalBroadcastManager方式),回调onReceive(context, intent)中的context返回值是:Application Context。
对于应用内广播的动态注册(非LocalBroadcastManager方式),回调onReceive(context, intent)中的context返回值是:Activity Context;
以上测试代码请点击这里。
参考文档:
https://developer.android.google.cn/guide/components/broadcasts.html
http://www.jianshu.com/p/f348f6d7fe59
http://www.jianshu.com/p/ca3d87a4cdf3
- BroadcastReceiver的总结
- BroadcastReceiver的总结
- 我的一些BroadcastReceiver总结
- BroadCastReceiver 总结
- BroadCastReceiver总结
- BroadcastReceiver总结
- BroadcastReceiver总结
- BroadcastReceiver总结
- BroadcastReceiver总结
- 关于广播接收器BroadcastReceiver的简单总结
- Android -- BroadcastReceiver的使用和总结
- android中BroadCastReceiver总结
- BroadcastReceiver基础总结
- Android BroadcastReceiver总结
- Android BroadcastReceiver学习总结
- Android BroadcastReceiver 广播总结
- Service和BroadcastReceiver总结
- Study-android BroadcastReceiver总结
- docker镜像推送到DockerHub
- Java 集合转换(数组、List、Set、Map相互转换)
- nyoj-传纸条(一)
- 曝光:内江苏家桥医院骗子医院
- 关于ThinkPHP的fetch与display
- BroadcastReceiver的总结
- USB3.0和USB2.0上电重置时序区别
- Spring AOP详解
- SPOJ 24258 DRUIDEOI
- 编写可执行的jar
- 谷歌(chrome)浏览器,页面翻译设置
- Elemental公司是一家视频发布技术厂商
- Runtime消息转发机制
- 贪心 poj2709 Painter