工作流程
AMS的工作流程,其实就是Activity的启动和调度的过程,所有的启动方式,最终都是通过Binder机制的Client端,调用Server端的AMS的startActivityXXX()
系列方法。所以可见,工作流程又包括Client端和Server端两个。
Client端流程
- 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()
方法。 Instrumentation.execStartActivity()
首先通过ActivityMonitor检查启动请求,然后调用ActivityManagerNative.getDefault()
得到ActivityManagerProxy代理对象,进而调用该代理对象的startActivity()
方法。- ActivityManagerProxy是ActivityManagerService的代理对象,因此其内部存储的是BinderProxy,调用
ActivityManagerProxy.startActivity()
实质是调用BinderProxy.transact()
向Binder驱动发送START_ACTIVITY_TRANSACTION命令。Binder驱动将处理逻辑从Launcher所在进程切换到ActivityManagerService所在进程。
作者:thinkChao
链接:https://www.jianshu.com/p/47eca41428d6
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。