赞
踩
一上来就总结吧,源码看的累,文末有流程图。
Activity启动流程总结起来就两条线:
1、要启动的Activity在不在栈里面,不在顶部新建一个,在的话拉起来复活;
2、要启动的Activity所在进程在不在,不在的话新建进程并新建Activity;进程在,但是Activity不存在就新建一个。
1、在server端创建Activity的基础数据的时候,需要借助PackageManagerService来选择合适的Activity,比如启动模式,策略等;
2、新建进程的时候,通过Socket连接创建一个ZygoteConnection句柄,最后运行runOnce方法调回到ActivityThread,开启新建Application和Activity的流程;
3、流程中左侧两列属于Client端,右边属于Server端,Android的进程通信以Binder作为桥梁。
ActivityThread,干活的;
IActivityManager,接口,定义对Binder的操作;
ActivityManagerProxy,Binder client端持有对server的代理,实现接口并获取native对象;
ActivityManagerNative,具体实现,运行onTransact;
ApplicationThread,实现server对client调用的方法,不过都要通过Handler发给ActivityThread干活,因为这个类在ActivityThread的屋檐下(内部类);
Instrumentation,傀儡,在合适的时机运行Application,Activity,Service等对应的生命周期;
LoadedApk,加载apk上下文,生成appContext;
ContextImpl,为Context服务,主要干活的。
Activity,界面呈现者;
Application,先运行,再运行其他的组件。
ActivityManagerService,核心大佬,负责策略调度;
ActivityStarter,践行者,启动流程;
ActivityStackSupervisor,大佬的左膀右臂,比较核心实现都在这个里面;
ActivityStack,栈的维护及管理;
IApplicationThread,定义调用client的接口;
ApplicationThreadProxy,实现接口,client端的代理,并持有native对象;
ApplicationThreadNative,Binder实际的践行者,运行onTransact;
Process,创建进程;
ZygoteState,Zygote状态,与Socket建立连接;
ZygoteInit,socket server端,创建服务端,并等待连接;
ZygoteConnection,socket服务端具体实现,运行主体在runOnce方法;
RuntimeInit,启动进程到这一步就要开始开挂,抛出异常回到ZygoteInit;
MethodAndArgsCaller,身处ZygoteInit屋檐下,来了异常马上映射调用到ActivityThread,开启Activity新的篇章。
只贴图,如下:
清晰图片地址:https://i.loli.net/2019/04/15/5cb438c1ca0ff.jpg
文章已经同步到微信公众号:Android部落格。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。