Activity启动过程

可以把启动过程分为client端和server端。 一、client端在启动一个Activity时进行的工作

(1)Launcher 这个进程的主线程,在捕获onClick点击事件后,调用 startActivitySafely 方法, startActivitySafely 方法内部调用了 startActivity 方法,然后,startActivity方法进而调用Launcher的父类Activity的 startActivity方法;
(2)Activity.startActivity方法 调用startActivityForResult 方法,传入该方法 的requestCode 参数为 -1 ,表示 Activity启动成功后,不需要执行 Lanucher.onActivityResult方法处理返回结果;startActivityForResult方法内部需要调用 Instrumentation 的 execStartActivity方法。Instrumentation 对象是用于监控应用程序和系统(主要是 Activity Manager )的交互过程。 (3)execStartActivity方法会把将要启动的Activity相关信息传送到ActivityManagerService 如果 ActivityMonitor 对启动Activity 进行检查没问题,那么会调用 ActivityManagerNative.getDault 得到ActivityManagerProxy代理对象,然后调用该代理对象的startActivity方法。; (4)调用ActivityManagerProxy代理对象的startActivity方法实际上是调用 BinderProxy.transact向 Binder驱动发送 STARTACTIVITYTRANSACTION命令,此时就从Lanucher进程切换到ActivityManagerService进程了。 总结上述四步:源Activity(这里是Launcher)所属进程通过一系列方法,(无论是通过Launcher来启动Activity,还是通过Activity内部调用startActivity接口来启动新的Activit),都通过Binder进程间通信进入到ActivityManagerService进程中,并且调用ActivityManagerService.startActivity接口;

二、Lanucher进程处理Activity的启动请求,就是Client端的工作,传递给 Server端的 ActivityManagerService 后。就是ActivityManagerService 进程的处理过程 了。 处理过程将分为 7个阶段 1、第一阶段——预启动检查
这个阶段,主要工作是检查是否有权限启动该Activity,查询系统中是否存在指定Intent的Activity, 检查Intent是否正确,检查当前能否切换Activity,各种检查通过后创建目标Activity的ActivityRecord, 判断是否有可复用的Task 或者Activity ,有则关联ActivityRecord,无则新建Task ,更新 ActivityManagerService中Task的数量,检查回退栈顶是否有显示的Activity,有则暂停。 2、第二阶段——暂停
这个阶段的主要工作就是暂停启动目标 Activity的源Activity,比如,我是从Actvity A启动Activity B的,那么在启动B之前需要把A暂停, 针对暂停的Activity的后续处理,要么是执行destroy 操作,要么是存入等待stop列表; 3、第三阶段——创建目标Activity所运行的进程
准备切换动画,查询ActivityManagerService 的mProcessNames变量中是否存在指定的进程信息,有则复用,直接启动Activity,无则通过zygote启动一个新的进程。进程启动超时时间一般是10s。 4、第四阶段——加载应用程序Activity
进程入口是 ActivityThread 的main方法,main方法里的主要工作是设置临时进程名,创建 UI主线程ActivityThread ,并调用其attach方法,最后进入主线程的消息循环。接下来的工作是为低内存设备禁用硬件加速,创建应用程序对应的Application, 并初始化,安装 Content Provider,执行Instrumentation的onCreate方法,执行Application的 onCreate方法。 5、第五阶段——显示Acitivity
在ActivityManagerService 所在进程向应用程序主线程的消息循环发送 LANUCHER_ACTIVITY消息,然后在主线程中回调Activity生命周期的onCreate, onStart,onResume等方法来显示 Activity,onResume方法执行完毕后,需要先把当前显示Activity所在的Task加入最近Task列表,然后才返回ActivityManagerService作后续处理。(在onResume方法之前,还可能会先回调onNewIntent 和 onActivityResult方法)

6、第六阶段——处理处于空闲状态的Activitiy
包括移除ActivityStack消息循环中的超时MSG,停止待停止列表总得Activity,销毁待销毁的Activity,如果是系统启动阶段,还要发送一个ACTIONBOOTCOMPLETEED广播,回收待回收应用程序进程等。最重要的一个操作就是停止源Activity 。

张鹏宇

继续阅读此作者的更多文章