ActivityManagerService和ActivityStack位于同一个进程中,而ApplicationThread和ActivityThread位于另一个进程中。其中,ActivityManagerService是负责管理Activity的生命周期的,ActivityManagerService还借助ActivityStack是来把所有的Activity按照后进先出的顺序放在一个堆栈中;对于每一个应用程序来说,都有一个ActivityThread来表示应用程序的主进程,而每一个ActivityThread都包含有一个ApplicationThread实例,它是一个Binder对象,负责和其它进程进行通信。
sss
我们每次通过Context来启动activity的时候,实际上是通过其实现类ContextImpl来实现的 ContextImpl 中启动activity的代码如下:
1 | @Override |
这里的mMainThread是一个ActivityThread对象,最终是通过Instrumentation.execStartActivity 方法启动activity的
1 | public ActivityResult execStartActivity( |
看下checkStartActivityResult方法,比较简单,主要是对启动的结果一个反馈
1 | /** @hide */ |
继续回到之前的ActivityManagerNative.getDefault()
1 | /** |
以上三个方法均位于ActivityManagerNative类中,通过上面的代码和注释这里会返回一个单例模式的ActivityManagerService服务,也就是说我们最终是通过ActivityManagerService.startActivity 来启动activity的
1 | @Override |
调用自己内部的 startActivityAsUser方法
1 | @Override |
mActivityStarter是ActivityStarter类的实例,该类的主要用来管理activity的出入栈和切换,看下ActivityStarter.startActivityMayWait方法
1 | final int startActivityMayWait(参数省略.....) { |
上面startActivityMayWait方法比较多的判断,主要代码就是我标注出来的那一段,接着又调用了自己内部的ActivityStackSupervisor.startActivityLocked方法
通过传入的caller形参(IApplicationThread类型,从Activity的startActivity函数就开始一个个函数调用传入)得到调用者进程相关信息,保存到callerApp(ProcessRecord类型)变量中,然后创建要启动的Activity相关信息。保存到r(ActivityRecord)变量中。
1 | final int startActivityLocked(参数省略 ...) { |
调用ActivityStarter.startActivityUnchecked方法
1 | private int startActivityUnchecked(final ActivityRecord r, ActivityRecord sourceRecord, |
转到了ActivityStackSupervisor.java中的resumeFocusedStackTopActivityLocked函数:
1 | boolean resumeFocusedStackTopActivityLocked() { |
接着又转到了ActivityStack.java中的resumeTopActivityUncheckedLocked方法
1 | boolean resumeTopActivityUncheckedLocked(ActivityRecord prev, ActivityOptions options) { |
又进入resumeTopActivityInnerLocked:
1 | private boolean resumeTopActivityInnerLocked(ActivityRecord prev, ActivityOptions options) { |
startPausingLocked应该是暂停启动Activity的那个Activity,然后又回到ActivityStackSupervisor中的startSpecificActivityLocked函数:
1 | void startSpecificActivityLocked(ActivityRecord r,boolean andResume, boolean checkConfig) { |
这里因为启动的Activity不是应用的第一个Activity所以上面app的信息不为null,进入realStartActivityLocked中:
1 | final boolean realStartActivityLocked(ActivityRecord r, ProcessRecord app, |
这里的app.thread是远程binder代理,它是在ActivityManagerNative中的onTransact中初始化:
1 | @Override |
1 | /** |
可以看到这个代理是ApplicationThreadProxy类型,调用scheduleLaunchActivity会进入stub实现类(ApplicationThread)里面:
1 | // we use token to identify this activity without having to send the |
1 | private void sendMessage(int what, Object obj, int arg1, int arg2, boolean async) { |
这里的mH是handler类型,发消息让它切换到主线程处理:
1 | private class H extends Handler { |
进入handleLaunchActivity:
1 | private void handleLaunchActivity(ActivityClientRecord r, Intent customIntent, String reason) { |
进入handleResumeActivity:
1 | final void handleResumeActivity(IBinder token,boolean clearHide, |
进入performLaunchActivity:
1 | private Activity performLaunchActivity(ActivityClientRecord r, Intent customIntent) { |
终于可以看到这里用Instrumentation创建Activity,接着创建Application、ContextImpl、Configuration等,接着调用Activity的attach函数,将创建的对象关联到Activity。
