Android Activity启动流程

一上来就总结吧,源码看的累,文末有流程图。

一、总结

Activity启动流程总结起来就两条线:

1、要启动的Activity在不在栈里面,不在顶部新建一个,在的话拉起来复活;

2、要启动的Activity所在进程在不在,不在的话新建进程并新建Activity;进程在,但是Activity不存在就新建一个。

二、在Activity启动过程中需要注意几个点:

1、在server端创建Activity的基础数据的时候,需要借助PackageManagerService来选择合适的Activity,比如启动模式,策略等;

2、新建进程的时候,通过Socket连接创建一个ZygoteConnection句柄,最后运行runOnce方法调回到ActivityThread,开启新建Application和Activity的流程;

3、流程中左侧两列属于Client端,右边属于Server端,Android的进程通信以Binder作为桥梁。

三、class分类

1、Client

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,先运行,再运行其他的组件。

2、Server

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新的篇章。

只贴图,如下:

The end:

ActivityManagerService
清晰图片地址:https://i-blog.csdnimg.cn/blog_migrate/e61dfcb47655f8fb6305e99dbad52c1c.jpeg

文章已经同步到微信公众号:Android部落格。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值