android系统启动流程
这意味着mAppThread变量可以直接转换为IApplicationThread。
6.1.3进行attach回调
ActivityThread.attach
注意,这里正是把mAppThread转换为IApplicationThread,再调用了mgr.attachApplication(mAppThread);。
1) ActivityManagerNative. getDefault
源代码路径\\frameworks\\base\\core\\java\\android\\app\\ActivityManagerNative.java
注意,这里有2个知识点:
a) binder通讯最终调用到ActivityManagerService.attachApplication
gDefault中return的am是ActivityManagerProxy类,传入的参数b是一个binder客户端(从ServiceManager.getService(\可以知道他是
ActivityManagerService的ibinder),该参数被赋值给mRemote变量。
31 / 41
android系统启动流程
这时ActivityThread.attach实际进入ActivityManagerProxy. attachApplication
transact通讯会使得服务端ActivityManagerService执行onTransact。
而ActivityManagerService自己继承自ActivityManagerNative,也没有重载onTransact,所以这里会执行ActivityManagerNative.onTransact,进入到
调用ActivityManagerService自己的attachApplication方法。
32 / 41
android系统启动流程
b 模板类
gDefault方法返回是一个模板类Singleton:
可以看到,这个模板类的作用就是将他的模板T统统搞成单例类,以保证
ActivityManagerNative. getDefault即使被反复调用,都始终只有一个binder客户端。
2)回到ActivityManagerService. attachApplication
继续看attachApplicationLocked
33 / 41
android系统启动流程
这里有两件事要关注: 第一:
makeActive这个方法将当前thread记录到了ProcessRecord下,这就是我们之前说的ProcessRecord.thread的来源。
第二:
程序最终进入了mStackSupervisor.attachApplicationLocked,可见如果完全由调用
lucnher的流程自己来拉起他的进程的话,最后转了一圈还是回到了mStackSupervisor。 mStackSupervisor.attachApplicationLocked到底做了什么?
6.1.4 ActivityStackSupervisor.attachApplicationLocked
一目了然,这个时候会走到调用realStartActivityLocked,而这个函数在前面4.1.4分析过了,会调用ActivityThread.ApplicationThread.scheduleResumeActivity触发显示。
6.1.5 ActivityStackSupervisor. ensureActivitiesVisibleLocked
mStackSupervisor.attachApplicationLocked的else的分支,会走到ensureActivitiesVisibleLocked也需要关注:
ensureActivitiesVisibleLocked会检查当栈顶的homestack对应的activity进程没有启动的话,他也会触发调用mStackSupervisor.startSpecificActivityLocked(r, false, false);
34 / 41
android系统启动流程
这意味着:其他任何进程走到这个attach的时候,只要luancher这个activity进入栈顶了,就可能执行这个动作拉起luancher的进程。
6.2 ApplicationThread内部类
上面attach流程中回传出来的thread实际是ActivityThread. ApplicationThread转换成IApplicationThread而来的;还记得之前我们分析luancher流程时,真正luancher的resume显示是靠app.thread.scheduleLaunchActivity和
app.thread.scheduleResumeActivity。现在就来看看这两个方法到底怎么在显示; 很显然这两个方法就在ApplicationThread这个内部类里面。
进入到ApplicationThread,看到的不仅仅是这两个方法,activity生命周期相关的动作处理都在这里了: schedulePauseActivity scheduleStopActivity scheduleResumeActivity scheduleLaunchActivity scheduleRelaunchActivity scheduleDestroyActivity。 这里只看我们关注的2个方法.
6.2.1 ActivityThread.ApplicationThread. scheduleLaunchActivity
1) ApplicationThread .scheduleLaunchActivity
2) H.handleMessage :
H是ApplicationThread的一个内部类,本质是一个handler:
H.handleMessage:
35 / 41