BroadCastReceiver相关知识--读书笔记
2013-12-30 16:55:07
1. BroadCastReceiver是Android四大组件之一,本质上是一个系统级的监视器。
2. 每次BroadCast事件发生后,系统都会创建对应的BroadCastReceiver对象,并自动触发它的onReceive()方法,这个方法需在10秒内执行完毕,否则会出现ANR。因此,如果需要完成一项耗时较长的任务,应该启动一个Service来完成,不能在BroadCastReceiver里面启动一个线程,因为BroadCastReceiver的生命周期本身很短,有时候会出现子线程没有执行完成,而BroadCastReceiver已经退出的情况,如果BroadCastReceiver所在的进程退出,虽然该进程内还有用户启动的新线程,但由于该进程内不包含任何组件,那么系统很有可能在资源紧张的情况下优先结束该进程,这样会导致子线程无法正常执行完毕。
3. BroadCastReceiver有两种注册方式:动态注册和静态注册
动态注册,即在代码中注册,如下:
package com.example.broadcastdynamic; import android.app.Activity;
import android.content.IntentFilter;
import android.os.Bundle; public class BroadCastDynamic extends Activity { public static final String INTENT_STRING = "com.android.david.BROADCAST"; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_broad_cast_static);
MyBroadCastReceiver receiver = new MyBroadCastReceiver();
IntentFilter filter = new IntentFilter();
filter.addAction(INTENT_STRING);
registerReceiver(receiver, filter);
}
}
静态注册,即在AndroidManifest文件中注册,如下:
<receiver android:name=".MyBroadCastReceiver">
<intent-filter >
<action android:name="com.android.david.BROADCAST"/>
</intent-filter>
</receiver>
4. 两种注册方式的区别:
4.1 静态注册在程序退出之后(点击back键,直到退出),仍然能接受并处理收到的broadcast,而动态注册则不能(Home键返回桌面是可以的)。
4.2 静态注册一旦注册,那么会一直运行在系统后台,这样比较耗费资源,而动态注册则可以用代码灵活控制,在onResume()中注册,在程序退出onPause()或不可见时取消注册:unregisterReceiver(receiver);
4.3 手机重新关开机,那么不论是静态注册还是动态注册,一概不能接受处理broadcast。
5. 广播的三种发送方式:sendBroadcast(intent), sendStickyBroadcast(intent)和sendOrderedBroadcast(intent, null)。
5.1 sendBroadcast,发送普通广播,如果BroadCastReceiver是动态注册的,那么它一旦退出,用这种方式发送出去的广播它是收不到的,而静态注册的可以收到。
5.2 sendStickyBroadcast发出的广播,动态注册的BroadCastReceiver可以在Activity再次onResume时收到广播。
5.3 sendOrderedBroadcast()方法用来向系统广播有序事件(Ordered broadcast),接收者按照在AndroidManifest.xml文件中设置的接收顺序依次接收Intent,顺序执行的,接收的优先级可以在系统配置文件中设置(声明在intent-filter元素的android:priority属性中,数值越大优先级别越高,其取值范围为-1000到1000。当然也可以在调用IntentFilter对象的setPriority()方法进行设置)。对于有序广播而言,前面的接收者可以对接收到得广播意图(Intent)进行处理,并将处理结果放置到广播意图中,然后传递给下一个接收者,当然前面的接收者有权终止广播的进一步传播。如果广播被前面的接收者终止后,后面的接收器就再也无法接收到广播了。具体代码如下:
设置优先级:
<intent-filter android:priority="">
终止BroadCastReceiver的继续传播或者添加数据并传递给下一个接收者:
abortBroadcast();
setResultExtras(Bundle);
下一个接收者可以取出上个接收者新添加进去的数据:
getResultExtras(true);
6. sendOrderedBroadcast典型应用:比如我们要过滤短信,我们知道,系统收到短信之后发出的BroadCast是OrderedBroadcast,那么我么可以注册一个Receiver,先截获短信广播并处理短信内容,同时取消广播继续传播,即可实现过滤垃圾短信的功能。
最新文章
- Huffman的应用_Huffman编码
- c# BlowFish 高速 对称加密
- Leetcode 198 House Robber
- Codeforces Round #364 (Div. 2) B. Cells Not Under Attack
- gulp初体验记录(简介、插件开发介绍)
- Qt 之 去除窗口部件被选中后的焦点虚线框(设置Qt::NoFocus即可)
- key_value 类型配置文件的解析
- ct任务添加与中控机批量后台操作
- 对于jdk jre jvm的简单认识
- WinForm程序中两份mdf文件问题的解决
- PPT2010小技巧 教你如何快捷抠图
- codevs 1557 热浪
- angular 4 router传递数据三种方法
- 随想:目标识别中,自适应样本均衡设计,自适应模型结构(参数可变自适应,模型结构自适应,数据类别or分布自适应)
- Dubbo 的配置主要分为三大类
- asp.net针对SQLSERVER数据库备份和恢复的一揽子问题解决
- let命令和块级作用域
- git shell 命令大全
- UGUI实现摇杆
- ubuntn中root密码设置和权限给予
热门文章
- 浅谈 MVP in Android
- hdu 1573 X问题
- jQuery.form.js jQuery ajax异步提交form
- openSUSE 国内镜像和镜像使用帮助 (zhuan)
- IE浏览器GET传参后台乱码
- jquery中DOM
- ifstream,fstream 读写文件问题,read读取字节不够
- 例题:打印乘法口诀。可能大家一看有点难,但只要理解for 循环嵌套,两层循环,外层循环行数,里层循环列数,搞清楚行数和列数之间的关系,就可以轻松做出这道题
- webpages框架使用@razor语法向js代码传递Json字符串
- postgresql 索引