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,先截获短信广播并处理短信内容,同时取消广播继续传播,即可实现过滤垃圾短信的功能。

BroadCastReceiver相关知识--读书笔记的更多相关文章

  1. android BSP与硬件相关子系统读书笔记(1)android BSP移植综述

    从linux驱动转行至Android驱动开发大半年了,一开始就产生了一个很纠结目标和问题,就是不停的google如何porting android!这个问题得到的结果对于初出茅庐的我,感到迷惘.随着工 ...

  2. 《DirectX 9.0 3D游戏开发编程基础》必备的数学知识 读书笔记

    最近在看游戏导航源码,但是看了几天感觉看不懂.里面全是一些几何运算,以及一些关于3d方面的知识.发现自己缺少3d这方面的知识,正好也想研究一下3d游戏开发的基本原理,于是决定买本书看看了,后来在ope ...

  3. CLR via C# 线程基础知识读书笔记

    1.线程的开销 a.线程内核对象 b.线程环境块 c.用户模式栈(1MB) d.内核模式栈 f.DLL线程连接和线程分离通知 2.线程的优先级由进程优先级和线程优先级共同组成 3.进程中所有的前台线程 ...

  4. MYSQL数据库相关操作---读书笔记分享

    ===================数据库软件: <DBMS,DataBase Management System >数据库: 保存特定类型数据的容器<DB,database> ...

  5. 《人月神话》读书笔记 PB16110698 第七周(~4.19)

    每逢读书笔记上交作业时刻,班级blog页面上总能看到<人月神话>相关的读书笔记,本次软工课邓老师推荐的第一篇读书笔记也是写的<人月神话>,算是对它“耳濡目染”了.本周,我终于抽 ...

  6. 《Programming Hive》读书笔记(两)Hive基础知识

    <Programming Hive>读书笔记(两)Hive基础知识 :第一遍读是浏览.建立知识索引,由于有些知识不一定能用到,知道就好.感兴趣的部分能够多研究. 以后用的时候再具体看.并结 ...

  7. 《Python网络编程》学习笔记--从例子中收获的计算机网络相关知识

    从之前笔记的四个程序中(http://www.cnblogs.com/take-fetter/p/8278864.html),我们可以看出分别使用了谷歌地理编码API(对URL表示地理信息查询和如何获 ...

  8. 《C#从现象到本质》读书笔记(一)第1章 .NET基础知识

    最近根据博客园大神的推荐,买了本<C#从现象到本质>.做一点读书笔记. 由于不懂IL和ildasm,winddg,太深奥,理解不了,就牛嚼草一样,先总结第一遍读书,自己总结的知识点了.不知 ...

  9. C#温故知新:《C#图解教程》读书笔记系列

    一.此书到底何方神圣? 本书是广受赞誉C#图解教程的最新版本.作者在本书中创造了一种全新的可视化叙述方式,以图文并茂的形式.朴实简洁的文字,并辅之以大量表格和代码示例,全面.直观地阐述了C#语言的各种 ...

随机推荐

  1. 构建maven项目3

    1.1.创建Jave Project 1.使用mvn archetype:generate命令,如下所示: mvn archetype:generate -DgroupId=com.mycompany ...

  2. Object Pascal 过程与函数

    过程与函数 过程与函数是实现一定功能的语句块,是程序中的特定功能单元.可以在程序的其他地方被调用,也可以进行递归调用.过程与函数的区别在于过程没有返回值,而函数有返回值. 1.过程与函数的定义 过程与 ...

  3. C++ 11 右值引用

    C++11中引入的一个非常重要的概念就是右值引用.理解右值引用是学习“移动语义”(move semantics)的基础.而要理解右值引用,就必须先区分左值与右值. 注意:左值右值翻译可能有些问题 *L ...

  4. 在Maven中设置Nexus私有服务为中央工厂(repository)

    原文:http://blog.csdn.net/mexican_jacky/article/details/50275695 nexus中的仓库列表 第一种方式: <repositories&g ...

  5. 在linux上搭建本地yum源

    准备yum仓库的光盘镜像IOS文件: 设置光驱加载本地磁盘的yum仓库的光盘镜像文件: 在linux的命令行输入setup命令打开设置窗口,选择"System Service": ...

  6. BOM头的来源

    类似WINDOWS自带的记事本等软件,在保存一个以UTF-8编码的文件时,会在文件开始的地方插入三个不可见的字符(0xEF 0xBB 0xBF,即BOM).它是一串隐藏的字符,用于让记事本等编辑器识别 ...

  7. python 暴力破解密码脚本

    python 暴力破解密码脚本 以下,仅为个人测试代码,环境也是测试环境,暴力破解原理都是一样的, 假设要暴力破解登陆网站www.a.com 用户 testUser的密码, 首先,该网站登陆的验证要支 ...

  8. linux笔记:linux常用命令-目录和文件处理命令

    命令格式: 命令 [-选项] [参数] 例: ls -la /etc 注意:个别命令的使用不遵循此格式. 目录处理命令:ls(列目录) 更多选项: -h 以kb等利于人阅读的方式取代字节显示文件大小 ...

  9. DSP - Bootloader学习笔记2

    DSP - Bootloader学习笔记2 彭会锋 1 本文主要以F2812为例进行说明的: F28027内部资源 F28027内存映射  

  10. 笔记2:傻瓜式盗QQ程序

    1.一个简单的盗QQ号的方法 仿做一个QQ的窗体 PS:当然里面有用的控件只有两个输入框和一个登陆按钮,其他的尽量做得像一些吧! 点登陆时的后台代码: PS:需要导入两个包:using System. ...