像java程序有main方法作为入口一样,Android程序也有入口,ActivityThread的main方法就是Android程序的入口,如下图:
接着看到调用ActivityThread的attach方法,如下:
mAppThread对象究竟是什么类型呢?如下:
回到 mgr.attachApplication(mAppThread);上图标记为B的地方,mgr本身是IActivityManager是一个接口,它的继承树结构如下图,上面我刚才提到mgr是系统服务ActivityManager的本地代理,所以这里mgr实际类型是Proxy,所以mgr.attachApplication(mAppThread)实际是调用的是Proxy里面的attachApplication方法,如下:
如果 mgr.attachApplication(mAppThread)调用完成了之后,Android与系统服务ActivityManager之间“双工”通信信道就建立完毕了,为了方便你理解我画一个图,如下:
上文我分析过ActivityManager系统服务在拥有ApplicationThread本地代理之后,就可以控制Android程序的主线程,比方说启动LaunchActivity,只要调用ApplicationThread本地代理的scheduleLaunchActivity则会引起Android程序ApplicationThread.Stub的scheduleLaunchActivity被调用,你理解Binder的机制的话 ,这些其实都很好理解,如果你不理解的话可以看看我之前写的Binder机制文章:https://www.jianshu.com/p/5de1718454f8 ApplicationThread.Stub的scheduleLaunchActivity方法如下:
mH.sendMessage(msg); 会导致ActivityThread.H的handleMessage背调用如下:
1.首先在ActivityThread的主线程,生成一个ApplicationThread对象,这个对象式能够对外提供远程服务的,换句话说别的进程可以通过这个对象的本地代理与我这个ActivityThread的主线程(ApplicationThread对象)通信
2.获取系统服务ActivityManager的本地代理对象
3.将生成的ApplicationThread对象通过ActivityManager的本地代理对象“发送”给系统服务ActivityManager,这样系统服务ActivityManager会"生成"ApplicationThread对象的本地代理,到此主线程与系统服务ActivityManager之间的“双工”通信信道就建立了
4.当你想要启动一个Activity的时候,系统服务ActivityManager就会调用ApplicationThread对象的本地代理的scheduleLaunchActivity方法,这样主线程的scheduleLaunchActivity也会相应的被调用,至此开始了Activity生命周期函数的回调。