Activity的启动过程 8.0

1、应用内Activity的启动过程

进程内Activity启动过程

在应用内调用startActivity时,最终会通知AMS来启动相应的Activity。在AMS及ActivityStarter、ActivityStackSupervisor、ActivityStack中会对启动的Activity进行一系列的信息构建(ActivityRecord),然后通过应用的ApplicationThread去执行启动的操作,在ApplicationThread中,通过ActivityThread发送Message 到mH:Handler中,由H的handleMessage执行handleLaunchActivity的操作,最终通过ClassLoader将Activity加载近内存中,调用onCreate方法调用。

1.1 疑问:
  1. 系统是怎样通知AMS启动相应Activity的?
  2. 系统是怎样调用ApplicationThread来执行LaunchActivity的?

在Instrumentation中调用ActivityManager.getService()来获取AMS实例,getService是个单例的静态方法,在AMS为null的时候,会通过ServiceManager.getService(Context.ACTIVITY_SERVICE) 获取AMS的IBinder实例,然后通过IActivityManager.Stub.newInstance(binder)来构建AMS的代理。从而通过这个代理类来调用AMS启动相应的Activity。

简而言之:Instrumentation调用ActivityManager.getService来获取AMS的代理对象,如果对象为空,则通过SystemManager.getService()来构建AMS代理类,并返回,通过AMS的这个代理类来启动Activity。


在启动ActivityThread中的main方法时,就会创建该应用进程的ApplicationThread,然后通过AMS调用attachApplication方法,将ApplicationThread与ApplicationRecord进行绑定,从而在AMS中就可以通过这个ApplicationThread来启动Activity了。

2、Launcher 启动应用的过程

与进程内启动Activity一样,也需要通过AMS来构建Activity的一些信息。然后判断Activity的ProcessRecord是否为你null,这时候就需要通过Zygote来构建应用进程,然后调用ActivityThread中的main方法,从而进程就启动起来了。再通过AMS的attachApplication将应用进程的Application与ProcessRecord关联。

Launcher_Zygote创建进程
在上面的时序图中描述了从Launcher到Zygote的过程。

Zygote _ ActivityThread.main.png
这里就是Zygote创建进程并查找ActivityThread的main方法过程。

新进程启动ActivityThread.png
新进程启动ActivityThread中的main方法的过程。

应用进程绑定到AMS.png
Application绑定到AMS,并启动Activity的过程。

总结

Activity启动过程中需要多个进程之间的交互才能完成,其中有两个关键的进程:

  1. Zygote进程,专用于孵化Android框架层和应用层程序的进程。
  2. system_server进程,该进程中运行了很多binder service,例如AMS(ActivityManagerService)、PMS(PackageManagerService)、WindowManagerService(WMS)等,这些binder service分别运行在不同的线程中,其中AMS负责管理Activity栈、应用进程、task;PMS负责系统中Package的管理、应用程序的安装、卸载、信息查询等;WMS负责管理系统中所有的窗口。

用户在Launcher程序里面点击应用图标,会通知ActivityManagerService启动应用的入口Activity,ActivityManagerService发现这个应用还未启动,则会通知Zygote进程fork应用进程,然后在这个(dalvik应用)进程里执行ActivityThread的main方法,在main方法中,让AMS保存应用进程的一个代理(ApplicationThread),这样ActivityManagerService可以通过这个代理对象控制应用进程。然后ActivityManagerService通知应用进程创建入口Activity的实例,并执行它的生命周期方法。

疑问:
  1. ActivityRecord 是什么时候创建的
  2. ProcessRecord 是什么时候创建的
  3. 在启动MainActivity之前,应用的ApplicationThread和ActivityThread应该是都创建好了的,那这些事是在什么时候创建的。
解答:
  1. ActivityRecord和ProcessRecord都是在AMS中创建的。
  2. 在Zygote创建完应用进程后,启动main方法中创建的。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值