Android广播机制-BroadcastReceiver

来源:互联网 发布:阿迪达斯网络授权书 编辑:程序博客网 时间:2024/05/22 13:48

初次跳槽,经验匮乏,offer至今没有拿到,快一个月了,又逼近年关,各种尴尬症并发!总结了下失利的因素:投简历没有经验;工作不对口;裸辞倒挺干脆;气运还是差了。但最主要的还是自身:haven’ t fall in love with programming yet,passive -learning ! 吃亏在于之前的工作性质导致我存在很多不足,还好我年轻,权且当做是积累经验。

1.概念:是一种广泛运用的在应用程序之间传输信息的机制。而BroadcastReceiver是对发送出来的 Broadcast进行过滤接受并响应的一类组件,主要用来接收来自系统和自定义的广播。

背景:android配置有不同的硬件组件,硬件按钮/加速器/WIFI/光传感器等,各种以不同的方式影响着手机的状态,需要一种机制监听这种变化,捕获系统事件和设置变化,以应对各种情况和编写出更健壮的应用程序。

2.应用场景 【系统广播类型举例】:、

2.1.开机广播:当开机完成后系统会产生一条广播,接收到这条广播就能实现开机启动服务的功能【android.intent.action.BOOT_COMPLETED】

2.2. 当网络状态改变:系统会产生一条广播,接收到这条广播就能及时地做出提示和保存数据等操作【android.net.conn.CONNECTIVITY_CHANG】

2.3. 电池电量改变:系统会产生一条广播,接收到这条广播就能在电量低时告知用户及时保存进度【android.intent.action.BATTERY_CHANGED】

注意事项:注册接收系统类型的广播,往往需要申请声明相应的使用权限,用uses-permission标签来标识,且不同的系统事件要求不同的注册方式。

3.注册方式
3.1.静态注册:在AndroidManifest.xml文件中配置
这里写图片描述
特点:只要设备开启,广播接收器也就开着,无论apk是否启动,其所订阅的广播出发时也会对其起作用。

3.2.动态注册:
Context. registerReceiver/unregisterReceiver 存在多个重载版本,常用如下:
void unregisterReceiver(BroadcastReceiver receiver);
Intent registerReceiver(BroadcastReceiver receiver, IntentFilter filter);

特点:随发送者的生命周期,

应用场景:如果只在应用程序处于运行或者活动状态时才关心广播事件,一旦组件销毁,广播也失效了。

4.reciver标签的各种属性

5.广播类型

5.1.普通广播:Normal Broadcast,异步;接收者无法终止广播,无法阻止其他接收者的接收动作;通过priority属性设置优先级[从-1000到1000.优先级越大,接收广播越靠前],使用Context.sendBroadcast(Intent intent);【返回值是void】来发送广播

5.2.有序广播:Ordered Broadcast,同步;每次只发送到优先级较高的接收者那里,然后由优先级高的接受者再传播到优先级低的接收者那里,优先级高的接收者有能力终止这个广播,同时还可以封装数据传递给下个接受者中。
BroadcastReceiver.setResultExtras(Bundle extras) 【返回值:void】
BroadcastReceiver.getResultExtras(boolean makeMap)【返回值:Bundle】
BroadcastReceiver .abortBroadcast() 【返回值:void】
Context. sendOrderedBroadcast(Intent , String permission)

5.3.粘性广播
Context.sendStickyBroadcast(Intent intent) //现在已经不推荐使用,可以先发送广播,后注册广播依旧收到,也就是intent会继续保留,允许之后匹配该intent的注册收到相同的广播。

6.生命周期

6.1. void onReceive(Context context, Intent intent);10秒内执行完就销毁;
【You cannot launch a popup dialog in your implementation of onReceive(),取而代之的是使用NotificationManager来提示,for interacting with services 使用Context.startService()而不是bindService】

6.2.触发过程:当Intent发送以后,所有已经注册的BroadcastReceiver会检查注册时的IntentFilter是否与发送的Intent相匹配,若匹配则就会调用BroadcastReceiver的onReceive()方法;

7. LocalBroadcastManager

参考文档:http://www.it165.net/pro/html/201308/6911.html

未完待续。。。

0 0
原创粉丝点击