开始调用
Activity可以调用startActivity来启动另一个Activity,通过调用栈,可追溯到Activity的startActivityForResult方法中。继续向里层跟进,是调用了Instrumentation#execStartActivity方法,里面通过ActivityTaskManager.getService,调用IActivityStackManager的startActivity方法。这里,我们找不到IActivityTaskManager的源码,google一下,找到IActivityStackManager是个aidl,其实现类是 ActivityTaskManagerService,在Servcer端。startActivity的实现是
return getActivityStartController().obtainStarter(intent, "startActivityAsUser")
.setCaller(caller)
.setCallingPackage(callingPackage)
.setResolvedType(resolvedType)
.setResultTo(resultTo)
.setResultWho(resultWho)
.setRequestCode(requestCode)
.setStartFlags(startFlags)
.setProfilerInfo(profilerInfo)
.setActivityOptions(bOptions)
.setMayWait(userId)
.execute();
再看ActivityStarter中的execute方法,间接调用了其startActivityMayWait方法,然后调用一系列重载方法,调用到startActivityUnChecked方法,通过RootActivityContainer来继续调用ActivityStack,最终调用到ActivityStack#startPausingLocked方法,在其中调用mService.getLifecycleManager().scheduleTransaction方法。最后调到mClient.scheduleTransaction方法,这里的mClient是个IApplicationThread的实例,这里的IApplicationThread的实现又回到Client来了,也就是ApplicationThread。由于ApplicationThread是ActivityThread的内部类,ApplicationThread#scheduleTransaction直接调用了ActivityThread.this.scheduleTransaction方法,继而调用了Activity.H来发送了一个ActivityThread.H.EXECUTE_TRANSACTION的Message。在ActivityThread.H的handleMessage的case EXECUTE_TRANSACTION分支中,调用了mTransactionExecutor.execute方法,会去执行传入的ClientTransaction#getCallbacks中拿到的List<ClientTransactionItem>的每个item的execute方法。追溯到调用mService.getLifecycleManager().scheduleTransaction的地方,传入的参数PauseActivityItem.obtain(prev.finishing...),最终会调用PauseActivityItem#execute方法,在其中调用了client.handlePauseActivity。这里其实就是调用了ActivityThread#handlePauseActivity,也就是将当前Activity给pause。
创建新进程
在ActivityStack的startPauseingLocked方法调用之后,会调用mStackSupervisor.startSpecificActivityLocked,在这个方法中判断如果当前已有进程,则直接调用realStartAcitivyLocked,否则通过一个ActivityManagerInternal::startProcess的Message来创建一个进程,这里又回到ActivityThread中的H来接收消息创建进程了。在创建进程时,实际是调用了ActivityManagerService的startProcess方法,进而调用ProcessList.startProcessLocked方法,在ProcessList.startProcessLocked的重载方法中调用了其startProcess方法。在这个startProcess方法里面,就是以传入的entryPoint为入口,创建一个进程,执行这个entryPoint。可以看到最初传进来的entryPoint是一个字符串"android.app.ActivityThread"
在ActivityThread的main方法中,可以看到,调用了Looper.prepareMainLooper(),这就是为main线程创建了一个MainLooper。然后new了一个ActivityThread对象,最后调用这个looper的loop方法,这里就陷入到MessageQueue的消息循环中了,如果没有新消息,就会"死循环"等待。
创建新的Activity
ActivityStackSupervisor的realStartActivityLocked方法中,向clientTransaction中添加了LaunchActivityItem的callback并将状态设置为Request,最后使用mService.getLifecyleManger()执行scheduleTransaction。这跟前面pause前一个Activity一样,这里是要执行LaunchActivityItem的execute方法,也就是要执行client.handleLaunchActivity,这里的client就是ActivityThread。又回到ActivithThread中来,通过Instrumentation来newActivity,调用其attach方法,设置其theme,通过Instrumentation#callActivityOnCreate方法来调用Activity的onCreate生命周期方法。
调用onResume
ActivityStackSupervisor中通过clientTransaction.addBack的来将创建Activity,紧接着在下面就给clientTransaction添加了LifecycleStateRequest,创建的时候入参andResume为true,也就是会使用ResumeActivityItem。ResumeActivityItem的execute方法中调用了client.handleResumeActivity,又是熟悉的味道,这个client就是ActivityThread对象。在ActivityThread的handleResumeActivity方法中,调用了performResumeActivity方法,继续调用了Activity的performResume,在Activity的performResume方法中就调用了Instrumentation的callActivityOnResume。几乎所有的Activity生命周期方法,都是通过这个Instrumentation来间接调用的。