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。