Android-Activty启动过程

开始调用

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来间接调用的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值