带着3个问题:
1.Binder类搞清楚
2.怎么回调的
3.插件化怎么搞的
流程:
点击Launcher,Launcher.AMN.singleton=代理AMS某接口,AMS通过Socket到Zygote,Zygote.fork,Zygote通过Socket到新进程,新进程.AMN.singleton=代理AMS某接口,bindApplication,AMS.某东西=新进程ApplicationThread,发消息。。。
1.Binder类你搞清楚了没
客户端/AMS
客户端的ApplicationThread是AMS要找到的东西,在AMS里有一个接口一致的代理类;
客户端的AMN.singleton是AMS的某个接口
就是说,ApplicationThread是AMS能够发现你的东西;
AMS.singleton是AMS中的某个接口,也是我们发现AMS的东西;
互相可以调用对方的方法。
2.怎么回调活动生命周期的?
这个问题是上个问题的基础。
拿到AMN.singleton,走到AMS,然后AMS会拿到ApplicationThread的代理,然后回调上一个活动的pause,再就不用再从这个进程回到AMS进程了。只不过是AMS分了一些时间片出去到本进程中,在运行本进程代码的时候,AMS是挂起的,然后本进程代码执行完了,AMS的代码继续跑。
然后经过一些列组件:ActivityStarter等,管理新活动的生命周期,同样也是用对应进程的ApplicationThread代理类,去操控。然后代理ApplicationThread.某方法,AMS就没代码了,所有东西就运行在本进程了。ApplicationThread开始onCreate、onStart、onResume。后面的我就没细看了,可能是等本进程代码执行完,AMS继续搞定上个活动的生命周期,也可能是AMS没代码了,然后本进程通过AMS.singleton去调用AMS某些方法。前者可能性大一些,因为一个活动启动一个另一个活动是一个完整的流程。
这就是AMS如何管理活动生命周期的原理。
3.插件化
在AMS.startActivity时替换已注册的活动,在H处理消息的时候,替换成真实的活动。
4.Instrumentation、ActivityStarter等有啥用,啥顺序?
Instrumentation可以认为是活动的一层简单的wrapper,用于管理活动的生命周期。然后这里会AMN.singleton走到AMS。然后是ActivityStarter为活动找到合适的栈,ActivityStackSupervisor栈的管理者,ActivityStack栈。然后回来的时候,ApplicationThread->H,随后也会回调Instrumentation。