本文是学习 《Android 系统源代码情景分析》 Activity启动过程笔记
在学习Activity启动过程中,调用的方法类,一个接着一个,刚开始看是看完了,但是还是晕晕乎乎的,之后总结问题在于,这个过程中的好多概念都没有理解,最后把常用的都总结一下,再次学习就流畅多了。下边是自己发现的几个学习源码非常好博客,推荐给大家
名称 | 地址 | 描述 |
---|---|---|
http://weishu.me | http://weishu.me | 内有 Android 插件化原理解析系列文章 |
Gityuan博客 | http://gityuan.com/ | 内容十分丰富 |
老罗的Android之旅 | http://blog.csdn.net/Luoshengyang | 学Android,看老罗 |
ActivityManagerService AMS
几个重要的参数:
caller:指向Launcher 组件所运行在的应用程序进程的ApplicationThread对象
intent:包含了即将启动的Activity的信息
resulTo:指向ActivityManagerService内部的一个ActivityRecoder对象,它里面保存了Launcher
组件的详细信息
在ActivityManagerService中,每一个Activity组件都有一个用户ID和一个进程名称;
UID是ActivityManagerService分配的,
PID而进程名称则是由该Activity组件的android:process
属性来决定的
Intrumentation
用来监控应用程序和系统之间的交互操作
weishu Android插件化原理解析——Hook机制之动态代理 代理Hook hock的就是 Intrumentation 可以实现知道当运行的是哪一个Activity.
/**
* Base class for implementing application instrumentation code. When running
* with instrumentation turned on, this class will be instantiated for you
* before any of the application code, allowing you to monitor all of the
* interaction the system has with the application. An Instrumentation
* implementation is described to the system through an AndroidManifest.xml’s
* <instrumentation> tag.
*/
ActivityThread
用来描述一个应用程序进程。系统每当启动一个应用进程时,都会在它里边加载一个ActivityThread实例,并且将这个ActivityThread类实例保存在每一个该进程中启动的Activity组件的父类Activity的成员变量mMainThread中内部对象 {内部类} ApplicationThread
ApplicationThread
Binder本地对象
ActivityManagerService 就是通过它和应用程序进行通信的
mToken
Activity 成员变量 mToken 的类型为IBinder,它是一个Binder代理对象,指向了ActivityManagerService中一个类型为ActivityRecoder 的Binder 本地对象, 这个ActivityRecoder 和ActivityClientRecord (在应用程序进程中使用)一样,都是用来描述启动的Activity组件的
ActivityRecoder
每一个已经启动的ActivityManagerService 中都有一个对应的ActivityRecoder对象,用来维护对应Activity组件的运行状态
以及信息有一个成员变量app 类型为ProcessRecord
描述Activity组件所运行在的应用程序进程。成员 thread 类型为ApplicationThreadProxy 用来描述一个Binder代理对象,引用的是一个类型为ApplicationThread的Binder本地对象
ActivityStack
用来描述一个Activity组件堆栈
mService 指向ActivityManagerService
mHistory :
同一个任务中所以Activity 组件都是连在一起的
8.ActivityInfo
ProcessRecrd
在ActivityManagerService中每一个应用进程都使用一个ProcessRecord对象描述,并保存在ActivityManagerService中。
描述Activity组件所运行在的应用程序进程。
成员变量thread :是一个Binder代理对象,它指向了用来运行MainActivity组件的应用程序进程的一个ApplicationThread 对象
ActivityClientRecoder
在应用程序进程中的每一个Activity组件都使用一个ActivityClientRecord对象来描述
ApplicationThreadProxy
Binder 代理对象
LoadedApk
ContextImpl
每一个Activty组件启动的时,ActivityThread 类都会为它创建一个ContectImpl对象,用来描述它运行的上下文环境。
这个ContextImpl对象就保存在这个Activity组件父类ContextWrapper的成员变量mBase中
ContextWrapper
mBase Context 类型 指向一个ComtextImpl对象
PackageManagerService
系统启动时会启动一个Package管理服务PackageManagerService,并通过它来安装系统中的应用程序。
PackageManagerService在安装一个应用程序过程中会对它的配置文件AndroidManifest.xml进行解析,
从而得到它里边的组件信息
Launcher
系统启动后会将,Launcher组件启动起来。Launcher组件启动过程中,会向PackageManagerService
查询所有Action名称为
category 名称为
的Activity组件,最后为每一个组件创建一个图标,并将它们的信息与各自的图标关联起来
ActivityManagerNative
getDefault 获取ActivityManagerService 的一个代理对象
Activity 组件 android:taskAffinity 属性
用来描述它的一个专属任务。