ActivityThread是Android Framework中一个非常重要的类,它代表一个应用进程的主线程(对于应用进程来说,ActivityThread的main函数确实是由该进程的主线程执行),其职责就是调度及执行在该线程中运行的四大组件

 

重要函数:

1、main()函数与systemMain()函数

这个两个函数均为ActivityThread的入口函数,所执行的主要供作就是实例化一个Activity示例并构建一个Android的运行环境;

main()函数由普通应用进程的主线程调用;

systemMain()函数由系统应用进程调用,如SystemServer(SystemServer希望他内部的service也通过Android运行环境交互,所以其可看成是一个特殊的系统应用进程)

ps: 应用进程指那些运行APK的进程,它们由Zyote 派生(fork)而来,上面运行了dalvik虚拟机。与应用进程相对的就是系统进程(包括Zygote和SystemServer)

下面来具体分析这两个函数:

android function怎么写 android main函数_ide

 

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

android function怎么写 android main函数_android function怎么写_02

以上两个方法在实例化ActivityThread对象之后,都调用了thread.attach(boolean b)函数执行接下来的工作,下面分析attach函数

 

2、attach函数(这里只有对系统进程的处理的分析,应用进程后补)

android function怎么写 android main函数_ide_03

 

attach函数根据参数传递的boolean值来判断要处理的是系统进程还是普通应用进程,同时实例化几个关键变量

Instrumentaion是一个工具类。当它被启用时,系统先创建它,再通过它来创建其他组件。另外,系统和组件之间的交互也将通过Instrumentation来传递,这样,Instrumentation就能监测系统和这些组件的交互情况了。在实际使用中,我们可以创建Instrumentation的派生类来进行相应的处理

Application类保存了一个全局的application状态。Application由AndroidManifest.xml中的<application>标签声明。在实际使用时需定义Application的派生类

Context是一个接口,通过它可以获取并操作Application对应的资源、类,甚至包含于Application中的四大组件。

实例化Context的时候,调用了getSystemContext()函数作为参数,下面分析getSystemContext()函数:

 

3、getSystemContext()函数

android function怎么写 android main函数_应用进程_04

 

ContextImpl的创建Context的过程参见:后补

ps:在getSystemContext函数中初始化ContextImpl的这个LoadedApk所代表的package名为“android”,其实就是framework-res.apk,由于该APK仅供SystemServer使用,所以此函数叫getSystemContext

 

4、installSystemApplicationInfo 绑定ApplicationInfo与Context,创建APK的运行环境

android function怎么写 android main函数_android function怎么写_05

 

5、installSystemProviders 创建一个ContentProvider实例

android function怎么写 android main函数_android function怎么写_06

 

 

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

android function怎么写 android main函数_实例化_07

 

installContentProviders实际上是标准的ContentProvider安装时调用的程序。安装ContentProvider包括两方面的工作:

 

·  先在ActivityThread中通过installProvider得到一个ContentProvider实例。

 

·  向AMS发布这个ContentProvider实例。如此这般,一个APK中声明的ContentProvider才能登上历史舞台,发挥其该有的作用。

 

提示 上述工作其实和Binder Service类似,一个Binder Service也需要先创建,然后注册到ServiceManager中。

 

 

7、installProvider函数 用以得到一个ContentProviderHolder实例

android function怎么写 android main函数_android function怎么写_08

 

 

重要内部类

private class ApplicationThread extends IApplicationThread.Stub{};

该类是AMS与应用进程进行跨进程交互的重要的类,Android提供了一个IApplicationThread.adil接口,该接口定义了AMS和应用进程之间的交互函数

android function怎么写 android main函数_应用进程_09

 

·  ApplicationThreadNative实现了IApplicationThread接口。从该接口定义的函数可知,AMS通过它可以和应用进程进行交互,例如,AMS启动一个Activity的时候会调用该接口的scheduleLaunchActivity函数。

·  ActivityThread通过成员变量mAppThread指向它的内部类ApplicationThread,而ApplicationThread从ApplicationThreadNative派生。