Android Intent 解析之二
服务端Intent运行过程:
Sticky:这个类型的BroadCast表示某些Intent须要被保留,当新的应用起来后,须要关注这个消息,可是呢,又不须要启动这个应用来接收此消息,比方耳机插入等消息。
这个函数的主要作用就是依据这个Intent的特点,构造BroadCastRecord添�到不同的列表,等待被处理;
这样发送就到了以下这个函数中了:
控制到了scheduleBroadcastsLocked这里,它的逻辑非常easy:
private final void scheduleBroadcastsLocked() {
if (mBroadcastsScheduled) {
return;
}
mHandler.sendEmptyMessage(BROADCAST_INTENT_MSG);
mBroadcastsScheduled = true;
}
先 推断mBroadcastsScheduled是否为真,假设为真就直接返回,这个变量主要是实现scheduleBroadcastsLocked和 processNextBroadcast之间的顺序运行,后面会看到在processNextBroadcast函数里面会把它设置为false; 以下就是通过BROADCAST_INTENT_MSG消息放入到消息队列里面,最后传递给mHandler,从这个角度来说Intent最后也是通过线程本身的消息队列来实现Intent的分发的;
消息分发过程:
mHandler收到BROADCAST_INTENT_MSG这个消息后便调用processNextBroadcast(boolean fromMsg)将消息分发出去了。以下介绍一下这个函数的流程:
1, 先推断fromMsg,假设是通过消息发送过来的就为真,否则为假; 假设为真mBroadcastsScheduled = false,这种话在函数scheduleBroadcastsLocked里面就能够再次发送BROADCAST_INTENT_MSG的消息从而触 发processNextBroadcast函数被再次调用;
2, 先推断mParallelBroadcasts是否为空,不为空就開始调用这个列表里面的receivers来接收消息,这个过程后面在串行intent 的时候也会碰到,我们留到后面讨论,这里仅仅须要知道它通过一个while循环把Intent发送给关注这个Intent的全部的receivers;
3, 再推断 mPendingBroadcast是否为空,假设不为空,就表示先前发送的串行的Intent还没有处理完成,一般出现这样的可能是由于我们要发送到的 receiver还没有启动,所以须要先启动这个activity,然后等待起来的这个activity处理,这时候,这个 mPendingBroadcast就为true;假设发送这样的情况须要推断这个Activity是否死了,假设死了,那么就把 mPendingBroadcast设为false,否则就直接返回,继续等待;
4, 接下来就顺序的从 mOrderedBroadcasts里面取出BroadCastRecord消息,然后对这个消息的receiver一个一个的调用其接收流程,注意这 里要把这个BroadCast的全部的receivers串行发送,都发送完了,才会进入到下一个BroadCastRecord消息;对于这个消息的处 理,先推断其接收者是不是BroadFilter,假设是,就调用deliverToRegisteredReceiver来接收,它的处理流程和前面的 处理并行BroadCast一样。
5,假设不是BroadCast Filter,就须要找出这个reiver所在的进程,这时候通常就是一个IntentFilter所在的进程,假设这个进程活着,那么就调用processCurBroadcastLocked(r, app)来处理。否则须要先启动这个进程,这就是startProcessLocked做的事情,然后设置mPendingBroadcast = r,这样等应用起来它会处理这个消息,后面会有进一步的说明;
到这里这个函数就结束了,比較复杂,里面另一些安全的检查等等,上面遗留了三个问题:
A)deliverToRegisteredReceiver的处理流程; B)processCurBroadcastLocked的处理流程; C)startProcessLocked以后的进程怎样处理这个唤醒它的Intent;
deliverToRegisteredReceiver
这里也分为这个receiver是否启动,假设已经启动就通过binder调用到了接收 activity的进程里面了。
processCurBroadcastLocked的逻辑
它和deliverToRegisteredReceive的终于区别,仅仅在于一个调用的是ScheduleRegisterdReceiver,一个是scheduleReceiver,这两个函数最后都会进入到目标activity的线程;
processCurBroadcastLocked
从这里能够看出最后通过Process.start启动了ActivityThread.java的进程,我们看看这个线程启动后的运行逻辑 首先是在进入主循环之前调用attachApplication通过binder调用进入到activityManagerService.java的进程; 这 个server进程在把我们先前设置的mPendingBroadcast设置为null,表示这个pending的broadcat已经得到处理了,然后调用 processCurBroadcastLocked来处理这个broadcast消息,最后通过
app.thread.scheduleReceiver进入到目标线程的接收流程;:
OK,到这里的话全部的发送分发流程已经结束了,剩下的就是两个接收函数还没有讨论一个就是ScheduleRegisterdReceiver,一个是scheduleReceiver;
Android Intent 解析之二的更多相关文章
- Android内存解析(二)— 详解内存,内部存储和外部存储
总述 觉得十分有必要搞清楚内存,内部存储和外部存储的区别,还有我们在开发中真正将数据存在了手机的哪儿. 先提一个问题:手机设置的应用管理中,每个App下都有清除数据和清除缓存,清除的分别是哪里的数据? ...
- Android zxing 解析二维码,生成二维码极简demo
zxing 官方的代码很多,看起来很费劲,此demo只抽取了有用的部分,实现了相机预览解码,解析本地二维码,生成二维码三个功能. 简化后的结构如下: 废话少说直接上代码: BaseDecodeHand ...
- Android Animation学习(二) ApiDemos解析:基本Animators使用
Android Animation学习(二) ApiDemos解析:基本Animatiors使用 Animator类提供了创建动画的基本结构,但是一般使用的是它的子类: ValueAnimator.O ...
- Android Camera系列开发 (二)通过Intent录制视频
Android Camera系列开发 (二)通过Intent录制视频 作者:雨水 2013-8-18 CSDN博客:http://blog.csdn.net/gobitan/ 概述 使用Camera ...
- Android数字签名解析(二)
在Android数字签名解析(一)中,介绍了android进行签名的两种方式,当中用密钥对进行签名用到了signapk.jar这个java库. 以下我们就看看signapk签名实现过程,signapk ...
- android XMl 解析神奇xstream 二: 把对象转换成xml
前言:对xstream不理解的请看:android XMl 解析神奇xstream 一: 解析android项目中 asset 文件夹 下的 aa.xml 文件 1.Javabeen 代码 packa ...
- android Intent介绍
Android中提供了Intent机制来协助应用间的交互与通讯,Intent负责对应用中一次操作的动作.动作涉及数据.附加数据进行描述,Android则根据此Intent的描述,负责找到对应的组件,将 ...
- Android学习笔记(二十一)——实战:程序数据共享
//此系列博文是<第一行Android代码>的学习笔记,如有错漏,欢迎指正! 我们继续在Database项目的基础上继续开发,通过内容提供器来给它加入外部访问接口.首先将 MyDataba ...
- [Android] Intent详解
[转]http://www.cnblogs.com/engine1984/p/4146621.html [正文] Intent组件虽然不是四大组件,但却是连接四大组件的桥梁,学习好这个知识,也非常的重 ...
随机推荐
- HDU1171:Big Event in HDU(多重背包分析)
通过分析,要使A>=B并且差值最小.所以只要使sum/2的容量下,B最大就Ok了 #include<iostream> #include<cstdio> #include ...
- SQL2008中Merge的用法(轉載)
在SQL2008中,新增了一个关键字:Merge,这个和Oracle的Merge的用法差不多,只是新增了一个delete方法而已.下面就是具体的使用说明: 首先是对merge的使用说明: merge ...
- 如何最简单的优化MySql
1.创建索引,一定要根据实际情况来创建,如果是连接表查询,如一个主帐号连接多个子帐号,可以考虑两个或三个以上的多索引: 2.合理利用时间排序,由于大多数表格用时间来排序,数据量相当大的时候,在时间列上 ...
- 在C语言中基本数据类型所占的字节数
基本数据类型所占的字节数其实跟C语言本身没有太大的关系,它取决于编译器的位数,下面这张表说明了不同编译器下基本数据类型的长度: 32位编译器中各基本类型所占字节数: 注:对于32位的编译器,指针变量的 ...
- 弹出窗口内嵌iframe 框口自适应
说一下,弹出窗口还有内嵌一个iframe 这种模式应该是不科学的,但是公司项目里面就偏偏用到了,它这高低还不能只适应,所以我痛苦的日子来了 分析一下: 首先window.showDialog 方法的时 ...
- centos6安装PHP5.4
安装的命令行很简单 sudo yum --enablerepo=remi install php 不过如果你没有配置源Repository,就需要首先启动REMI源: wget http://rpms ...
- js+jquery+css3
(原生js+jquery+css3) 前言 项目需求要弄个瀑布流的页面,用的是waterfall这个插件,感觉还是可以的,项目赶就没自己的动手写.最近闲来没事,就自己写个.大致思路理清楚,还是挺好实现 ...
- (C#)Windows Shell 外壳编程系列7 - ContextMenu 注册文件右键菜单
原文 (C#)Windows Shell 外壳编程系列7 - ContextMenu 注册文件右键菜单 (本系列文章由柠檬的(lc_mtt)原创,转载请注明出处,谢谢-) 接上一节:(C#)Windo ...
- Java学习之DBUtils工具的学习
简介 commons-dbutils 是 Apache 组织提供的一个开源 JDBC工具类库,它是对JDBC的简单封装,学习成本极低,并且使用dbutils能极大简化jdbc编码的工作量,同时也不会影 ...
- HDOJ 1003 Max Sum(线性dp)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1003 思路分析:该问题为最大连续子段和问题,使用动态规划求解: 1)最优子结构:假设数组为A[0, 1 ...