Android源码——Broadcast Receiver
Android源码分析——广播
广播是一种在组件之间进行消息传递的方式。广播机制的实现是基于Binder进程间通信。
Binder进程间通信和广播的差别:Binder中,Client组件和Service组件通信之前必须先获得Service的一个代理对象,Client组件事先要知道Service组件的存在。广播发送者事先是不要知道广播接收者的存在。因此,广播发送者和接收者之间的耦合度较低。
广播是基于消息发布和订阅者模型实现的。
在同等情况下,动态注册的广播接收者要比静态注册的广播接收者优先收到广播。
android.intent.action.SCREEN_OFF android.intent.action.SCREEN_ON,这两个类型的广播只能被动态注册的接收器处理
发送方如何指定该广播可以被谁接收:设置自定义权限。
广播接收者的注册过程
ContextWrapper.registerReceiver
ContextImpl. registerReceiver
ActivityManagerProxy.registerReceiver
ActivityManagerService.registerReceiver
广播的发送过程
广播发送主要过程:
- 广播发送者将一个广播发送给AMS。
- AMS接收到一个广播后,首先找到这个广播的接收者,然后将他们添加到一个广播调度队列中,最后向AMS所在的线程消息队列发送一个类型为BROADCAST_INTENT_MSG的消息。
- 当AMS所在线程消息队列中的BROADCAST_INTENT_MSG消息被处理时,AMS就会从广播调度队列中找到需要接收广播的广播接收者,并将对应的广播发送给他们所在的进程。
- 广播接收者所运行在的应用程序进程接收到AMS发送过来的广播之后,将广播封装成一个消息,并发送到主线程消息队列中。当该消息被处理时,应用程序进程才会将该广播发送给相应的广播接收者处理。
第1步——广播发送者将一个广播发送给AMS:
ContextWrapper.sendBroadcast
ContextImpl.sendBroadcast
ActivityManagerProxy.broadcaseIntent
ActivityManagerService. broadcaseIntent
第2步——查找目标广播接收者
ActivityInfo ai = AppGlobals.getPackageManager().getReceiverInfo(intent.getComponent,
STOCK_PM_FLAGS);
If(ai!=null){
Receivers = new ArrayList();
ResolveInfo ri = new ResolveInfo();
Ri.activityInfo = ai;
Receivers.add(ri);
}
AMS通过消息处理机制将广播转发给目标广播接收者。
AMS将广播(无序或有序)封装为一个广播转发任务,并添加到内部一个有序广播调度队列中。
动态注册广播接收者、静态注册广播接收者两个队列都是按照优先级从高到低的顺序来排列的。
if(curr.getPriority() >= curt.priority)说明如果一个动态注册的目标广播接收者和静态注册的广播接收者的优先级相同,动态注册的接收者排在前面,即先收到广播。
ActivityManagerService.scheduleBroadcastLocked发送一个类型为BROADCAST_INTENT_MSG消息。
第3步——处理AMS发送的消息
Handler.handleMessage
ActivityManagerService.processNextBroadcast
ActivityManagerService.deliverToRegisteredReceiverLocked
如果BroadcastFilter.requiredPermission的值不为null,那么就表示ActivityManagerService需要检查广播发送者的权限。
如果BroadcastRecord对象的成员变量requiredPermission的值不为null,表示AMS需要检查广播接收者的权限。
以上这两个权限是调用AMS成员函数checkComponentPermission来检查对方PID和UID是否符合要求。
ActivityManagerService.performReceiverLocked
第4步——广播接收者处理MSG
ApplicationThread.scheduleRegisteredReceiver
InnerReceiver.performReceive
ReceiverDispatcher.performReceive
Args.run
BroadcastReceiver.onReceive
Android源码——Broadcast Receiver的更多相关文章
- Android源码分析-全面理解Context
前言 Context在android中的作用不言而喻,当我们访问当前应用的资源,启动一个新的activity的时候都需要提供Context,而这个Context到底是什么呢,这个问题好像很好回答又好像 ...
- 2014年最新720多套Android源码2.0GB免费一次性打包下载
之前发过一个帖子,但是那个帖子有点问题我就重新发一个吧,下面的源码是我从今年3月份开始不断整理源码区和其他网站上的android源码,目前总共有720套左右,根据实现的功能被我分成了100多个类,总共 ...
- 阅读android源码了解 android 加载so的流程
参考原文:http://bbs.pediy.com/thread-217656.htm Android安全–linker加载so流程,在.init下断点: http://www.blogfshare. ...
- Android源码分析(六)-----蓝牙Bluetooth源码目录分析
一 :Bluetooth 的设置应用 packages\apps\Settings\src\com\android\settings\bluetooth* 蓝牙设置应用及设置参数,蓝牙状态,蓝牙设备等 ...
- Android源码阅读 – Zygote
@Dlive 本文档: 使用的Android源码版本为:Android-4.4.3_r1 kitkat (源码下载: http://source.android.com/source/index.ht ...
- Eclipse与Android源码中ProGuard工具的使用
由于工作需要,这两天和同事在研究android下面的ProGuard工具的使用,通过查看android官网对该工具的介绍以及网络上其它相关资料,再加上自己的亲手实践,算是有了一个基本了解.下面将自己的 ...
- Android 源码下载方法(Git 方式clone)
Android源码对于Android开发者来说,迟早有一天你会用到的,所以就记录一下,分享给读者,希望对读者有用 这里需要使用到Git相关知识,不清楚的可以先阅读,了解的可以跳过 Git-Tortoi ...
- Android源码编译make的错误处理
android源码下载:官方下载 或参考android源码下载方式 Android编译版本: PLATFORM_VERSION=4.0.1(最新Android 4.0.1) OS 操作系统平台: Li ...
- Atitit.反编译apk android源码以及防止反编译apk
Atitit.反编译apk android源码以及防止反编译apk 1.1. Tool apk逆向助手1 1.2. 二.使用dex2jar + jd-gui 得到apk的java源码1 1.3. 用 ...
随机推荐
- 关于MySql的1045错误修正
很多情况数据库很久没有使用,偶尔打开会出现一系列错误,例如1045错误即是 mysql ERROR 1045 : Access denied for user‘root’@localhost(usin ...
- BPM实例分享——日期自动计算
日期自动计算 在请假流程中通常我们需要获得请假开始到请假结束时间的天数,那么请假天数(可结合工作日历)是怎么实现系统计算呢?下面我们来看下配置的方法. 1. 首选建立业务服务BPMService, ...
- ArcGIS Engine开发前基础知识(1)
ArcGIS二次开发是当前gis领域的一项重要必不可少的技能.下面介绍它的基本功能 一.ArcGIS Engine功能 在使用之前首先安装和部署arcgis sdk,(在这里不在赘述相关知识)可以实现 ...
- Android中的AlertDialog使用示例五(自定义对话框)
在Android开发中,我们经常会需要在Android界面上弹出一些对话框,比如询问用户或者让用户选择.这些功能我们叫它Android Dialog对话框,AlertDialog实现方法为建造者模式. ...
- SVN为什么比Git更好
首先我表明一个根本的立场,我个人更喜欢用Git,但是,这仅仅是一个个人偏好.当我们需要将一种技术方案带给整个团队的时候,并不是由我们的个人偏好作为主要决定因素,而应该充分去权衡利弊,选择对团队,对公司 ...
- ASP.NET MVC 5 05 - 视图
PS: 唉,这篇随笔国庆(2015年)放假前几天开始的,放完假回来正好又赶上年底,公司各种破事儿. 这尼玛都写跨年了都,真服了.(=_=#) 好几次不想写了都. 可是又不想浪费这么多,狠不下心删除.没 ...
- RHEL6.3系统安装
进入安装界面 这里选择跳过 点击下一步 选择安装语言 选择键盘 选择系统储存方式 选择是否格式化储存设备 给安装的系统一个计算机名 选择时区 给ro ...
- 常用算法——排序(二)
简单选择排序法 选择排序(Selection Sort)的基本思想:对n个记录进行扫描,选择最小的记录,将其输出,接着在剩下的n-1个记录中扫描,选择最小的记录将其输出,--不断重复这个过程,直到只剩 ...
- fixed数据类型
在处理图形运算,特别是3D图形生成运算时,往往要定义一个Fixed数据类型,我称它为定点数,定点数其时就是一个整形数据类型,他的作用就是把所有数 进行转换,从而得到相应类型的整型表达,然后使用定点数进 ...
- Lis日常维护
1.[问题]护士站打印LIs条码,出来是PDF格式的 [解决]在文件夹Client\NeusoftLis\Xml\Print.xml中把BarcodePrint Name的值改成安装的斑马打印机名(不 ...