ActivityThread 源码分析
ActivityThread是Android Framework中一个非常重要的类,它代表一个应用进程的主线程(对于应用进程来说,ActivityThread的main函数确实是由该进程的主线程执行),其职责就是调度及执行在该线程中运行的四大组件
重要函数:
1、main()函数与systemMain()函数
这个两个函数均为ActivityThread的入口函数,所执行的主要供作就是实例化一个Activity示例并构建一个Android的运行环境;
main()函数由普通应用进程的主线程调用;
systemMain()函数由系统应用进程调用,如SystemServer(SystemServer希望他内部的service也通过Android运行环境交互,所以其可看成是一个特殊的系统应用进程)
ps: 应用进程指那些运行APK的进程,它们由Zyote 派生(fork)而来,上面运行了dalvik虚拟机。与应用进程相对的就是系统进程(包括Zygote和SystemServer)
下面来具体分析这两个函数:

-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

以上两个方法在实例化ActivityThread对象之后,都调用了thread.attach(boolean b)函数执行接下来的工作,下面分析attach函数
2、attach函数(这里只有对系统进程的处理的分析,应用进程后补)

attach函数根据参数传递的boolean值来判断要处理的是系统进程还是普通应用进程,同时实例化几个关键变量
Instrumentaion是一个工具类。当它被启用时,系统先创建它,再通过它来创建其他组件。另外,系统和组件之间的交互也将通过Instrumentation来传递,这样,Instrumentation就能监测系统和这些组件的交互情况了。在实际使用中,我们可以创建Instrumentation的派生类来进行相应的处理
Application类保存了一个全局的application状态。Application由AndroidManifest.xml中的<application>标签声明。在实际使用时需定义Application的派生类
Context是一个接口,通过它可以获取并操作Application对应的资源、类,甚至包含于Application中的四大组件。
实例化Context的时候,调用了getSystemContext()函数作为参数,下面分析getSystemContext()函数:
3、getSystemContext()函数

ContextImpl的创建Context的过程参见:后补
ps:在getSystemContext函数中初始化ContextImpl的这个LoadedApk所代表的package名为“android”,其实就是framework-res.apk,由于该APK仅供SystemServer使用,所以此函数叫getSystemContext
4、installSystemApplicationInfo 绑定ApplicationInfo与Context,创建APK的运行环境

5、installSystemProviders 创建一个ContentProvider实例

6、installContentProviders这个函数是所有ContentProvider产生的必经之路

installContentProviders实际上是标准的ContentProvider安装时调用的程序。安装ContentProvider包括两方面的工作:
· 先在ActivityThread中通过installProvider得到一个ContentProvider实例。
· 向AMS发布这个ContentProvider实例。如此这般,一个APK中声明的ContentProvider才能登上历史舞台,发挥其该有的作用。
提示 上述工作其实和Binder Service类似,一个Binder Service也需要先创建,然后注册到ServiceManager中。
7、installProvider函数 用以得到一个ContentProviderHolder实例

重要内部类
private class ApplicationThread extends IApplicationThread.Stub{};
该类是AMS与应用进程进行跨进程交互的重要的类,Android提供了一个IApplicationThread.adil接口,该接口定义了AMS和应用进程之间的交互函数
· ApplicationThreadNative实现了IApplicationThread接口。从该接口定义的函数可知,AMS通过它可以和应用进程进行交互,例如,AMS启动一个Activity的时候会调用该接口的scheduleLaunchActivity函数。
· ActivityThread通过成员变量mAppThread指向它的内部类ApplicationThread,而ApplicationThread从ApplicationThreadNative派生。
ActivityThread 源码分析的更多相关文章
- PackageManager源码分析
在android 4.4源码上进行的分析. 一.PackageManager如何产生的? 我们平时在代码中使用的context.getPackageManager() 那么这个PackageManag ...
- Android Small插件化框架源码分析
Android Small插件化框架源码分析 目录 概述 Small如何使用 插件加载流程 待改进的地方 一.概述 Small是一个写得非常简洁的插件化框架,工程源码位置:https://github ...
- Android源码分析-全面理解Context
前言 Context在android中的作用不言而喻,当我们访问当前应用的资源,启动一个新的activity的时候都需要提供Context,而这个Context到底是什么呢,这个问题好像很好回答又好像 ...
- Handler、Looper、MessageQueue、Thread源码分析
关于这几个之间的关系以及源码分析的文章应该挺多的了,不过既然学习了,还是觉得整理下,印象更深刻点,嗯,如果有错误的地方欢迎反馈. 转载请注明出处:http://www.cnblogs.com/John ...
- 源码分析Android Handler是如何实现线程间通信的
源码分析Android Handler是如何实现线程间通信的 Handler作为Android消息通信的基础,它的使用是每一个开发者都必须掌握的.开发者从一开始就被告知必须在主线程中进行UI操作.但H ...
- Android事件传递机制详解及最新源码分析——Activity篇
版权声明:本文出自汪磊的博客,转载请务必注明出处. 在前两篇我们共同探讨了事件传递机制<View篇>与<ViewGroup篇>,我们知道View触摸事件是ViewGroup传递 ...
- Android查缺补漏(View篇)--事件分发机制源码分析
在上一篇博文中分析了事件分发的流程及规则,本篇会从源码的角度更进一步理解事件分发机制的原理,如果对事件分发规则还不太清楚的童鞋,建议先看一下上一篇博文 <Android查缺补漏(View篇)-- ...
- onCreate源码分析
原文地址Android面试题-onCreate源码都没看过,怎好意思说自己做android Activity扮演了一个界面展示的角色,堪称四大组件之首,onCreate是Activity的执行入口,都 ...
- 插件开发之360 DroidPlugin源码分析(四)Activity预注册占坑
请尊重分享成果,转载请注明出处: http://blog.csdn.net/hejjunlin/article/details/52258434 在了解系统的activity,service,broa ...
随机推荐
- 数据库分库分表(sharding)系列
数据库分库分表(sharding)系列 目录; (一) 拆分实施策略和示例演示 (二) 全局主键生成策略 (三) 关于使用框架还是自主开发以及sharding实现层面的考量 (四) 多数据源的 ...
- JAVA Freemarker + Word 模板 生成 Word 文档 (普通的变量替换,数据的循环,表格数据的循环,以及图片的东替换)
1,最近有个需求,动态生成 Word 文当并供前端下载,网上找了一下,发现基本都是用 word 生成 xml 然后用模板替换变量的方式 1.1,这种方式虽然可行,但是生成的 xml 是在是太乱了,整理 ...
- python初学心得之一
昨天开始接触并学习python,对python有了初步印象. 一.python主要应用方向 二.python语言类型 三.python2和3的主要区别 四.常见字符编码 五.Python语法初学 一 ...
- CountDownLatch原理及使用场景
CountDownLatch是通过一个计数器来实现的,计数器的初始值为线程的数量.每当一个线程完成了自己的任务后,计数器的值就会减1.当计数器值到达0时,它表示所有的线程已经完成了任务,然后在闭锁 上 ...
- C语言语法
1.函数指针类型定义,然后指针结构体类型定义,最后的调用形式为aaa.bbb();(aaa为结构体变量)或者 aaa->bbb();(aaa为结构体指针),函数指针最好用结构体封装起来变成指针结 ...
- R语言-图形辅助
1.画底纹格子 grid()函数 > plot(rnorm(100)) > grid() #画底纹格子 > grid(nx=NA, ny=8, #画水平底纹,横坐标无分隔,纵坐 ...
- 如何在Mac上用汇编语言写HelloWorld
首先,Mac自带nasm,不过我们要先将其升级. 升级它的方法有很多种,因为我已经装好了homebrew,所以我直接在终端输入: brew install nasm 这样就升级啦- 接下来,创建一个H ...
- angular1时间控件之时间比较大小,比如入住日期和离店日期,入住不能晚于离店时间
功能可能是大家有时遇到的,不过angluar1现在用的人很少了,希望帮上和我一样掉坑里的朋友吧,之前自己也在网上找过几乎没找到angluar1和我代码需求一样的控件,没办法自己造 了,看代码图 就差不 ...
- C语言典型编程3
关于C的一些小而精的编程,适合希望提升编程能力的初学者学习:关键编程也就几句,但思维可以迁移到其他编程语言.同一问题,算法多种. //判断三角形类型#include<stdio.h>mai ...
- JASPER打印单据,标签开发培训, 界面开发培训
JASPER打印单据,标签开发培训软件:TIBC JASPER Studio.Jaspersoft Studio是一个专为JasperReports报表引擎而开发的报表设计器,是 iReport设计器 ...