Android Intent 解析之二

服务端Intent执行过程:

Sticky:这个类型的BroadCast表示某些Intent需要被保留,当新的应用起来后,需要关注这个消息,但是呢,又不需要启动这个应用来接收此消息,比如耳机插入等消息。

这个函数的主要作用就是根据这个Intent的特点,构造BroadCastRecord加入到不同的列表,等待被处理;

这样发送就到了下面这个函数中了:

控制到了scheduleBroadcastsLocked这里,它的逻辑很简单:

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的进程; 这 个服务器进程在把我们先前设置的mPendingBroadcast设置为null,表示这个pending的broadcat已经得到处理了,然后调用 processCurBroadcastLocked来处理这个broadcast消息,最后通过
app.thread.scheduleReceiver进入到目标线程的接收流程;:

OK,到这里的话所有的发送分发流程已经结束了,剩下的就是两个接收函数还没有讨论一个就是ScheduleRegisterdReceiver,一个是scheduleReceiver;

Android Intent 解析之二,布布扣,bubuko.com

时间: 2024-10-19 13:43:21

Android Intent 解析之二的相关文章

Android Intent 解析之一

Intent的架构包括三方面: Client,也就是发送这个Intent的activity: Server,也就是activityManagerService.java,它主要是负责分发这些Intent给适当的对象: Target,也就是那些需要处理这个Intent的activity,我们称为Receiver: Intent的三个主要方面:Action.Data.Category在之前的文档中也有介绍,在此就不在叙述了. 下面回到前面的例子: Intent intent = new Intent

Android Intent 解析之三

Intent的接收过程: 1.Receiver的注册 这个之前已经介绍过了 接下来就看看上面遗留的两个接收函数了, scheduleReceiver scheduleRegisteredReceiver: scheduleReceiver会掉到activitythread.java中的scheduleReceiver函数, activitythread.java这个就是目标activity的主体,然后该函数就调用到该文件中的handlemessage函数,这个函数在收到RECEIVER消息后就调

Android Volley解析(二)之表单提交篇

上一篇文章中,讲了 Volley 的 get 和 post 请求,并且对 volley 的基本使用和基本分析做了讲解,而这篇 blog 将讲解用 volley 实现表单的提交,在看这篇文章之前,如果对 Volley 基本知识不够了解的朋友,可以移驾前往Android Volley解析(一)之GET.POST请求篇 表单提交的数据格式 要实现表单的提交,就要知道表单提交的数据格式是怎么样,这里我从某知名网站抓了一条数据,先来分析别人提交表单的数据格式. 数据包: Connection: keep-

Android核心服务解析篇(二)——Android源码结构分析

获得Android源码后,我们来分析源码结构.源码的全部工程分为如下三个部分. ①Core Project:核心工程部分,这是建立Android系统的基础,保存在根目录的各个文件夹中. ②External Project:扩展工程部分,可以使其他开源项目具有扩展功能,保存在external文件夹中. ③Package:包部分,提供了Android的应用程序,内容提供者,输入法和服务,保存在package文件夹中. 在获取的Android4.3源码目录中,包含了原始Android的目标机代码,主机

Android内存解析(二)— 详解内存,内部存储和外部存储

总述 觉得十分有必要搞清楚内存,内部存储和外部存储的区别,还有我们在开发中真正将数据存在了手机的哪儿. 先提一个问题:手机设置的应用管理中,每个App下都有清除数据和清除缓存,清除的分别是哪里的数据? 一   内存,内部存储和外部存储 1. 可对Android手机存储空间做如下划分: 整个存储空间分为内部存储和外部存储两部分,内部存储中又包含RAM和ROM等部分. 2. 具体概念区分 内部存储,即InternalStorage,也常说内置存储卡,这是手机内置的存储空间,出厂时就被确定,是手机的一

Android volley 解析(三)之文件上传篇

前面我们讲了如何通过 volley 实现表单的提交,而这篇文章跟上一篇衔接很大,如果没有看上一篇 blog 的朋友,建议先去看看 Android Volley解析(二)之表单提交篇 因为文件上传实质就是表单的提交,只不过它提交的数据包含文件类型,接下来还是按照表单提交的套路来分析. 数据格式 这里我们通过图片上传的案例来分析,其他文件也是同样的实现方式:以下是我在传图网传图时,上传的数据格式,先来分析一下 POST http://chuantu.biz/upload.php HTTP/1.1 H

Android Fragment解析(二)

上篇博客中已经介绍了Fragment产生原因,以及一些基本的用法和各种API. 本篇将介绍上篇博客提到的:如何管理Fragment回退栈,Fragment如何与Activity交互,Fragment与Activity交互的最佳实践,没有视图的Fragment的用处,使用Fragment创建对话框,如何与ActionBar,MenuItem集成等~~ 1.管理Fragment回退栈 类似与Android系统为Activity维护一个任务栈,我们也可以通过Activity维护一个回退栈来保存每次Fr

Android zxing 解析二维码,生成二维码极简demo

zxing 官方的代码很多,看起来很费劲,此demo只抽取了有用的部分,实现了相机预览解码,解析本地二维码,生成二维码三个功能. 简化后的结构如下: 废话少说直接上代码: BaseDecodeHandler: package com.song.zxing.decode; import android.graphics.Bitmap; import android.os.Bundle; import com.google.zxing.BarcodeFormat; import com.google

Android 开源框架Universal-Image-Loader完全解析(二)--- 图片缓存策略详解

本篇文章继续为大家介绍Universal-Image-Loader这个开源的图片加载框架,介绍的是图片缓存策略方面的,如果大家对这个开源框架的使用还不了解,大家可以看看我之前写的一篇文章Android 开源框架Universal-Image-Loader完全解析(一)--- 基本介绍及使用,我们一般去加载大量的图片的时候,都会做缓存策略,缓存又分为内存缓存和硬盘缓存,我之前也写了几篇异步加载大量图片的文章,使用的内存缓存是LruCache这个类,LRU是Least Recently Used 近