当前位置:   article > 正文

Android Activity启动流程

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.loli.net/2019/04/15/5cb438c1ca0ff.jpg

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

声明:本文内容由网友自发贡献,转载请注明出处:【wpsshop】
推荐阅读
相关标签
  

闽ICP备14008679号