首页 > 代码库 > Android 是怎么启动一个Acitivity的?

Android 是怎么启动一个Acitivity的?

可以把启动过程分为client端和server端。

一、client端在启动一个Activity时进行的工作

备注:我个人理解,client端指的是相对后台ActivityManagerService进程来说的前台用户可见的进程,如在界面启动某一个Activity的就是Laucher进程。这里则以从home桌面启动一个Activity来分析启动过程:

1Launcher这个进程的主线程,在捕获onClick点击事件后,调用startActivitySafely方法,startActivitySafely方法内部调用了

startActivity方法,然后,startActivity方法进而调用Launcher的父类ActivitystartActivity方法;

 

2Activity.startActivity方法调用startActivityForResult方法,传入该方法requestCode参数为 -1,表示 Activity启动成功后,不需要执行 Lanucher.onActivityResult方法处理返回结果;startActivityForResult方法内部需要调用 Instrumentation execStartActivity方法。Instrumentation对象是用于监控应用程序和系统(主要是 Activity Manager)的交互过程。

3execStartActivity方法会把将要启动的Activity相关信息传送到ActivityManagerService如果 ActivityMonitor对启动Activity进行检查没问题,那么会调用 ActivityManagerNative.getDault得到ActivityManagerProxy代理对象,然后调用该代理对象的startActivity方法。;

4)调用ActivityManagerProxy代理对象的startActivity方法实际上是调用 BinderProxy.transact Binder驱动发送 START_ACTIVITY_TRANSACTION命令,此时就从Lanucher进程切换到ActivityManagerService进程了。

 

总结上述四步:源Activity(这里是Launcher)所属进程通过一系列方法,(无论是通过Launcher来启动Activity,还是通过Activity内部调用startActivity接口来启动新的Activit,都通过Binder进程间通信进入到ActivityManagerService进程中,并且调用ActivityManagerService.startActivity接口; 


二、Lanucher进程处理Activity的启动请求,就是Client端的工作,传递给 Server端的 ActivityManagerService后。就是ActivityManagerService进程的处理过程了。

 

处理过程将分为 7个阶段

1、第一阶段——预启动检查

这个阶段,主要工作是检查是否有权限启动该Activity,查询系统中是否存在指定IntentActivity检查Intent是否正确,检查当前能否切换Activity,各种检查通过后创建目标ActivityActivityRecord判断是否有可复用的Task或者Activity,有则关联ActivityRecord,无则新建Task,更新ActivityManagerServiceTask的数量,检查回退栈顶是否有显示的Activity,有则暂停。

 

2、第二阶段——暂停

这个阶段的主要工作就是暂停启动目标 Activity的源Activity,比如,我是从Actvity A启动Activity B的,那么在启动B之前需要把A暂停,

针对暂停的Activity的后续处理,要么是执行destroy操作,要么是存入等待stop列表;

 

3、第三阶段——创建目标Activity所运行的进程

准备切换动画,查询ActivityManagerServicemProcessNames变量中是否存在指定的进程信息,有则复用,直接启动Activity,无则通过zygote启动一个新的进程。进程启动超时时间一般是10s

 

4、第四阶段——加载应用程序Activity

进程入口是 ActivityThreadmain方法,main方法里的主要工作是设置临时进程名,创建 UI主线程ActivityThread,并调用其attach方法,最后进入主线程的消息循环。接下来的工作是为低内存设备禁用硬件加速,创建应用程序对应的Application并初始化,安装 Content Provider,执行InstrumentationonCreate方法,执行Application onCreate方法。

 

5、第五阶段——显示Acitivity

ActivityManagerService所在进程向应用程序主线程的消息循环发送 LANUCHER_ACTIVITY消息,然后在主线程中回调Activity生命周期的onCreate onStart,onResume等方法来显示 ActivityonResume方法执行完毕后,需要先把当前显示Activity所在的Task加入最近Task列表,然后才返回ActivityManagerService作后续处理。(在onResume方法之前,还可能会先回调onNewIntent onActivityResult方法)


 

6、第六阶段——处理处于空闲状态的Activitiy

 

包括移除ActivityStack消息循环中的超时MSG,停止待停止列表总得Activity,销毁待销毁的Activity,如果是系统启动阶段,还要发送一个ACTION_BOOT_COMPLETEED广播,回收待回收应用程序进程等。最重要的一个操作就是停止源Activity


备注:此文是读书所得,主要归纳于老罗的《Android 源代码情景分析》和杨云君老师的《Android的设计与实现I》。


Android 是怎么启动一个Acitivity的?