1.首先在ActivityThread的主线程,生成一个ApplicationThread对象,这个对象式能够对外提供远程服务的,换句话说别的进程可以通过这个对象的本地代理与我这个ActivityThread的主线程(ApplicationThread对象)通信;
2.获取系统服务ActivityManager的本地代理对象
3.将生成的ApplicationThread对象通过ActivityManager的本地代理对象“发送”给系统服务ActivityManager,这样系统服务ActivityManager会"生成"ApplicationThread对象的本地代理,到此主线程与系统服务ActivityManager之间的“双工”通信信道就建立了
4.当你想要启动一个Activity的时候,系统服务ActivityManager就会调用ApplicationThread对象的本地代理的scheduleLaunchActivity方法,这样主线程的scheduleLaunchActivity也会相应的被调用,至此开始了Activity生命周期函数的回调。
代码较多,下面由我给大家再次简单总结下:
Activity 的启动,实际上是一个进程间交互的过程,即本地app 与 AMS 交互,涉及到两点:
本地app -> AMS : 给 AMS 各种参数,要求启动 Activity
AMS -> 本地app : AMS处理完了,回调本地 app Activity 生命周期
可以看到这两个进程间相互通信,那么就找 Binder 就好了,从app -> AMS,这个比较简单,通过 ServiceManager.getService 拿到 AMS 的代理对象(Binder)即可和 AMS 通信。
而 AMS -> app 则如上文所说,我们在 ActivityThread 中创建了一个 ApplicationThread (Binder) 对象传递给 AMS 的。