标签:
一、BroadcastReceiver的基本概念
广播接收者,无界面,用来接收系统事件或自定义广播(intent形式)。可以用它对外部事件进行过滤并只对感兴趣的事件作出响应,比如网络变化,电量变化等,也可以是启动一个activity或Service或弹出一个Notification等。
广播分类:
随机广播:通过Context.sendBroadcast()发送。所有接收者接收顺序随机,不能结束或终止广播。
有序广播:通过Context.sendOrderedBroadcast()发送,根据优先级(android:priority)顺序接收,前面的接受者可以改变或者abort这个广播。
StickyBroadcast 粘性广播:也分有序和无序,通过Context.sendStickyBroadcast(intent)或Context.sendStickyOrderedBroadcast()发送,需要添加权限"android.permission.BROADCAST_STICKY",粘性广播会一直驻留在系统中,以便注册者能够尽快收到广播,直到调用removeStickyBroadcast(intent)把它去掉,
二、生命周期
只有一个onReceive()的生命周期回调函数,执行完该函数就销毁该对象,生命周期只有10秒左右,如果在onReceive()内处理超过10miao的事情,则会报ANR,所以如果有耗时操作最好发送Intent给Service(后台服务)来完成。(注:这里如果用子线程来处理耗时工作是不可靠的,因为BroadcastReceiver的生命周期很短10s,有可能子线程没结束BroadcastReceiver就先结束了,如果BroadcastReceiver所在的进程此时没有任何活动组件(即空进程),便很有可能被杀掉,工作的子线程也会被杀死。)
三、基本用法
1、注册
只要设备开机,哪怕APP未启动,也能实现对注册广播的监听。
在AndroidManifest.xml中通过xml形式静态注册,如下:
<receiver android:name=".MyBroadcastReceiver" > <intent-filter android:priority = "1000" > <action android:name="android.provider.Telephony.SMS_RECEIVED" /> </intent-filter> </receiver >
当然,你此时用到了接收短信的权限,需要添加短信相关的权限配置。
<uses-permission android:name="android.permission.RECEIVE_SMS"/>
运行时的上下文销毁,注册便失效。动态注册就是在代码中运行时注册,形式如下:
private BroadcastReceiver myBroadcastReceiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { } }; IntentFilter intentFilter = new IntentFilter("android.provider.Telephony.SMS_RECEIVED"); registerReceiver(myBroadcastReceiver, intentFilter); ... ... //取消注册监听 unregisterReceiver(myBroadcastReceiver);
2、发送 & 接收
上面基本概念已描述过,大多通过Context.send****Broadcast(),根据使用场景,发送你需要的广播,括号里主要传入intent对象,intent描述过滤的action和category,还可以封装少量数据。在接收过程三个步骤:1.创建Receiver对象-->2.调用onReceive()-->3.销毁。接收优先级上,注明android:priority的数值越大,越先接收,同级别则随机;如果未注明priority情况下,代码注册先于xml注册接收。
标签:
原文地址:http://www.cnblogs.com/ddd2014/p/4309255.html