Activity启动流程分析一 总体流程步骤分析

Launcher进程启动App进程MainActivity

Launcher主线程捕获onClick()点击事件后,调用Launcher.startActivitySafely()方法。Launcher.startActivitySafely()内部调用了Launcher.startActivity()方法,Launcher.startActivity()内部调用了Launcher的父类Activity的startActivity()方法。

Activity.startActivity()调用Activity.startActivityForResult()方法,传入该方法的requestCode参数若为-1,则表示Activity启动成功后,不需要执行Launcher.onActivityResult()方法处理返回结果。

启动Activity需要与系统ActivityManagerService交互,必须纳入Instrumentation的监控,因此需要将启动请求转交instrumentation,即调用Instrumentation.execStartActivity()方法。

nstrumentation.execStartActivity()首先通过ActivityMonitor检查启动请求,然后调
ActivityManagerNative.getDefault()得到ActivityManagerProxy代理对象,进而调用该代理对象的startActivity()方法。
ActivityManagerProxy是ActivityManagerService的代理对象,因此其内部存储的是BinderProxy,调用ActivityManagerProxy.startActivity()实质是调用BinderProxy.transact()向Binder驱动发送START_ACTIVITY_TRANSACTION命令。Binder驱动将处理逻辑从Launcher所在进程切换到ActivityManagerService所在进程。

我们从Instrumentation开始分析,假设是ActivityA启动ActivityB,在ActitityA中执行

Intent intent = new Intent();
intent.setclass(this, ActivityB.class);
startActivity(intent);

解析Activity的启动参数

我们不能直接启动一个activity,首先第一步就是解析要启动activity的启动参数,包括栈信息,启动模式等。

ActivityStackSupervisor,ActivityStack,ActivityRecord管理和启动activity

我们拿到了要启动的activity的参数,交给栈来管理和启动这个activity。所以管理启动我们activity的是ActivityStack,但是framework中存在一个类ActivityRecord,源码中的注释介绍:An entry in the history stack, representing an activity。翻译:历史栈中的一个条目,代表一个activity。第二步就是在栈中启动activty。Activity里面有很多的生命周期,会有一个ActivityStackSupervisor把这些生命周期封装成一个ClientTransaction事务,然后把事务通过Binder传递给app进程处理。

ClientTransaction在AMS和App之间的通信流程

我们要启动的activity的生命周期肯定是在App进程中执行的,这涉及到AMS和App进程的通信。第三步就是AMS和App通信。

App进程拿到ClientTransaction执行ActivityB的生命周期

通信完成,第四步就是在App进程里面管理ActivityB的生命周期。

ActivityA的生命周期管理

ActivityB成功启动了,最后一步就是管理ActivityA的生命周期,执行ActivityA的onstop。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值