Activity启动的概要流程

#Activity启动的概要流程

用户从Launcher程序点击应用图标可启动应用的入口Activity,Activity启动时需要多个进程之间的交互,Android系统中有一个zygote进程专用于孵化Android框架层和应用层程序的进程。还有一个system_server进程,该进程里运行了很多binder service,例如ActivityManagerService,PackageManagerService,WindowManagerService,这些binder service分别运行在不同的线程中,其中ActivityManagerService负责管理Activity栈,应用进程,task。

activity_start_flow.png

主要分为5步:

1.Launcher程序捕获到用户点击应用图标时,会通知ActivityManagerService(下文简称AMS)启动应用入口Activity。

2.AMS检测到这个应用还未启动,则会通知Zygote进程孵化出应用进程。

3.在这个dalvik应用进程中执行ActivityThread.main()

4.应用进程通知AMS,应用进程已经启动,AMS保存应用进程的代理对象,通过这个代理对象来控制应用进程。

5.AMS通知应用进程创建入口Activity实例,并执行其生命周期方法。

###浅谈ActivityManagerService
Activity的管理采用binder机制,管理Activity的接口是IActivityManager。

AMS是在system_server进程中实现Activity的管理。

ActivirtyManagerProxy对象是AMS在普通应用进程的一个代理对象,应用进程通过AMP代理对象调用AMS提供的功能。应用进程并不会直接创建AMP对象,而是通过ActivityManagerNative类的工具方法getDefault方法得到。

ActivityManagerService管理Activity时,主要涉及以下几个类:

1.ActivityManagerService,它是管理activity的入口类,聚合了ProcessRecord对象和ActivityStack对象

2.ProcessRecord,表示应用进程记录,每个应用进程都有对应的ProcessRecord对象

3.ActivityStack,该类主要管理回退栈

4.ActivityRecord,每次启动一个Actvity会有一个对应的ActivityRecord对象,表示Activity的一个记录

5.ActivityInfo,Activity的信息,比如启动模式,taskAffinity,flag信息(这些信息在AndroidManifest.xml里声明Activity时填写)

6.TaskRecord,Task记录信息,一个Task可能有多个ActivityRecord,但是一个ActivityRecord只能属于一个TaskRecord