Android 是怎么启动一个Acitivity的?

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

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

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

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

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

 

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所运行的进程

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

 

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

进程入口是 ActivityThread main方法,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》。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值