Android源碼探究:Activity啟動(dòng)流程完全解析(下)

概述

本文的內(nèi)容緊接著上一篇文章Android源碼探究:Activity啟動(dòng)流程完全解析(上),繼續(xù)介紹Activity的啟動(dòng)流程。

主流程分析

8-1、ActivityManagerService#activityPaused(token)
經(jīng)過(guò)客戶端的跨進(jìn)程調(diào)用,AMS的activityPaused(token)被調(diào)用了。

    @Override
    public final void activityPaused(IBinder token) {
        final long origId = Binder.clearCallingIdentity();
        synchronized(this) {
            ActivityStack stack = ActivityRecord.getStackLocked(token);
            if (stack != null) {
                stack.activityPausedLocked(token, false);
            }
        }
        Binder.restoreCallingIdentity(origId);
    }

根據(jù)token來(lái)獲取Activity所在的ActivityStack,進(jìn)一步調(diào)用activityPausedLocked(params..)

8-2、ActivityStack#activityPausedLocked(params..)

final void activityPausedLocked(IBinder token, boolean timeout) {
    //先從ActivityStack根據(jù)token取出對(duì)應(yīng)的ActivityRecord
    final ActivityRecord r = isInStackLocked(token);
    if (r != null) {
        mHandler.removeMessages(PAUSE_TIMEOUT_MSG, r);
        //如果二者相等,表示記錄的需要暫停的Activity已經(jīng)暫停完畢
        if (mPausingActivity == r) {
            mService.mWindowManager.deferSurfaceLayout();
            try {
                completePauseLocked(true /* resumeNext */, null /* resumingActivity */);
            } finally {
                mService.mWindowManager.continueSurfaceLayout();
            }
            return;
        } else {
            //省略...
        }
    }
    mStackSupervisor.ensureActivitiesVisibleLocked(null, 0, !PRESERVE_WINDOWS);
}

這里沒(méi)什么好說(shuō)的,我們繼續(xù)看completePauseLocked(params..)。

8-3、ActivityStack#completePauseLocked(params..)

private void completePauseLocked(boolean resumeNext, ActivityRecord resuming) {
    ActivityRecord prev = mPausingActivity;

    //省略大部分的代碼...

    if (resumeNext) {
        final ActivityStack topStack = mStackSupervisor.getFocusedStack();
        if (!topStack.shouldSleepOrShutDownActivities()) {
            mStackSupervisor.resumeFocusedStackTopActivityLocked(topStack, prev, null);
        } else {
            //...
        }
    }

}

當(dāng)代碼執(zhí)行到這里的時(shí)候,讀者應(yīng)該對(duì)這個(gè)方法resumeFocusedStackTopActivityLocked(params..)有點(diǎn)眼熟吧?上面已經(jīng)執(zhí)行過(guò)該方法了,接下來(lái)的調(diào)用鏈都是一樣的了,最終會(huì)執(zhí)行到ActivityStackSupervisor#startSpecificActivityLocked(params..)這個(gè)方法,進(jìn)行Activity的真正啟動(dòng)過(guò)程。

8-4、ActivityStackSupervisor#startSpecificActivityLocked(params..)

void startSpecificActivityLocked(ActivityRecord r,
        boolean andResume, boolean checkConfig) {
    //獲取Activity所對(duì)應(yīng)的進(jìn)程記錄
    ProcessRecord app = mService.getProcessRecordLocked(r.processName,
            r.info.applicationInfo.uid, true);

    getLaunchTimeTracker().setLaunchTime(r);

    //如果該進(jìn)程已經(jīng)啟動(dòng)了,那么直接開(kāi)始啟動(dòng)Activity
    if (app != null && app.thread != null) {
        try {
            //若該Activity的flag不包含多進(jìn)程標(biāo)志位 或 不是安卓框架的組件
            if ((r.info.flags&ActivityInfo.FLAG_MULTIPROCESS) == 0
                    || !"android".equals(r.info.packageName)) {
                // Don't add this if it is a platform component that is marked
                // to run in multiple processes, because this is actually
                // part of the framework so doesn't make sense to track as a
                // separate apk in the process.
                // 如果它是一個(gè)標(biāo)記為多進(jìn)程運(yùn)行的平臺(tái)組件,則不要添加該項(xiàng),
                // 因?yàn)檫@實(shí)際上是安卓框架的一部分,因此在進(jìn)程中作為單獨(dú)的apk進(jìn)行跟蹤是沒(méi)有意義的。
                app.addPackage(r.info.packageName, r.info.applicationInfo.longVersionCode,
                        mService.mProcessStats);
            }
            //真正地啟動(dòng)一個(gè)Activity
            realStartActivityLocked(r, app, andResume, checkConfig);    
            return;
        } catch (RemoteException e) {
            //...
        }

        // If a dead object exception was thrown -- fall through to
        // restart the application.
    }

    //代碼9-1:否則,先啟動(dòng)一個(gè)新的進(jìn)程,然后再啟動(dòng)Activity
    mService.startProcessLocked(r.processName, r.info.applicationInfo, true, 0,
            "activity", r.intent.getComponent(), false, false, true);
}

代碼的邏輯很清晰明了,主要是先判斷Activity所對(duì)應(yīng)的進(jìn)程是否已經(jīng)存在,如果存在了那就直接去執(zhí)行真正的啟動(dòng)Activity過(guò)程;如果該進(jìn)程還不存在,那么就要去啟動(dòng)一個(gè)進(jìn)程。接下來(lái)的分析有兩條路可以走,一是沿著Activity啟動(dòng)進(jìn)行分析;二是沿著進(jìn)程的啟動(dòng)進(jìn)行分析。實(shí)際上進(jìn)程的啟動(dòng)完畢之后也還是要進(jìn)行Activity的啟動(dòng)的。也就是說(shuō)調(diào)用了mService.startProcessLocked(params)后,會(huì)啟動(dòng)新的進(jìn)程,然后ActivityStackSupervisor再次調(diào)用realStartActivityLocked(params..)在進(jìn)程內(nèi)啟動(dòng)Activity。
其實(shí),這個(gè)調(diào)用順序符合這一種情況:在進(jìn)程A的ActivityA內(nèi)啟動(dòng)了進(jìn)程B的ActivityB,此時(shí)先暫停進(jìn)程A的ActivityA,然后進(jìn)程B還沒(méi)有啟動(dòng),那么先啟動(dòng)進(jìn)程B,然后再啟動(dòng)ActivityB。
因此,接下來(lái)我們先來(lái)看怎樣啟動(dòng)一個(gè)新的進(jìn)程。


9-1、ActivityManagerService#startProcessLocked(params..)

final ProcessRecord startProcessLocked(String processName,
        ApplicationInfo info, boolean knownToBeDead, int intentFlags,
        String hostingType, ComponentName hostingName, boolean allowWhileBooting,
        boolean isolated, boolean keepIfLarge) {
    return startProcessLocked(processName, info, knownToBeDead, intentFlags, hostingType,
            hostingName, allowWhileBooting, isolated, 0 /* isolatedUid */, keepIfLarge,
            null /* ABI override */, null /* entryPoint */, null /* entryPointArgs */,
            null /* crashHandler */);
}

private final boolean startProcessLocked(ProcessRecord app, String hostingType,
        String hostingNameStr, boolean disableHiddenApiChecks, String abiOverride) {
        //省略大部分代碼...

        final String entryPoint = "android.app.ActivityThread";
        return startProcessLocked(hostingType, hostingNameStr, entryPoint, app, uid, gids,
                runtimeFlags, mountExternal, seInfo, requiredAbi, instructionSet, invokeWith,
                startTime);
    } 
}
//一系列startProcessLocked(params..)重載方法的調(diào)用
//最終會(huì)調(diào)用下面的startProcess(params..)方法

private ProcessStartResult startProcess(String hostingType, String entryPoint,
        ProcessRecord app, int uid, int[] gids, int runtimeFlags, int mountExternal,
        String seInfo, String requiredAbi, String instructionSet, String invokeWith,
        long startTime) {
    try {
        final ProcessStartResult startResult;
        if (hostingType.equals("webview_service")) {
            startResult = startWebView(entryPoint,
                    app.processName, uid, uid, gids, runtimeFlags, mountExternal,
                    app.info.targetSdkVersion, seInfo, requiredAbi, instructionSet,
                    app.info.dataDir, null,
                    new String[] {PROC_START_SEQ_IDENT + app.startSeq});
        } else {
            startResult = Process.start(entryPoint,
                    app.processName, uid, uid, gids, runtimeFlags, mountExternal,
                    app.info.targetSdkVersion, seInfo, requiredAbi, instructionSet,
                    app.info.dataDir, invokeWith,
                    new String[] {PROC_START_SEQ_IDENT + app.startSeq});
        }
        return startResult;
    } 
}

中間省略了大部分的重載方法的調(diào)用,最后來(lái)到了Process.start(params..),把一系列進(jìn)程有關(guān)的信息都傳遞了進(jìn)去,根據(jù)這些信息來(lái)創(chuàng)建一個(gè)進(jìn)程。

9-2、Process#start(params..)
這個(gè)類的源碼在Android SDK內(nèi)可以找到,我們直接看它的代碼:

public static final ProcessStartResult start(final String processClass,
                              final String niceName,
                              int uid, int gid, int[] gids,
                              int runtimeFlags, int mountExternal,
                              int targetSdkVersion,
                              String seInfo,
                              String abi,
                              String instructionSet,
                              String appDataDir,
                              String invokeWith,
                              String[] zygoteArgs) {
    return zygoteProcess.start(processClass, niceName, uid, gid, gids,
                runtimeFlags, mountExternal, targetSdkVersion, seInfo,
                abi, instructionSet, appDataDir, invokeWith, zygoteArgs);
}

這里我們需要關(guān)注一個(gè)參數(shù)processClass,當(dāng)一個(gè)進(jìn)程被啟動(dòng)后,以processClass為類名的類的main(args)函數(shù)會(huì)被調(diào)用。而這里的processClass是代碼9-1中傳遞進(jìn)來(lái)的“android.app.ActivityThread”。那么也就是說(shuō),一個(gè)新的進(jìn)程啟動(dòng)后,它的ActivityThread的main()函數(shù)會(huì)最先得到執(zhí)行。所以,ActivityThread#main()是整個(gè)應(yīng)用程序的入口

9-3、zygoteProcess#start(params..)
代碼執(zhí)行到了zygoteProcess的start(params..)方法,我們先來(lái)看一下代碼的執(zhí)行:

public final Process.ProcessStartResult start(final String processClass,
        final String niceName,int uid, int gid, int[] gids,
        int runtimeFlags, int mountExternal,int targetSdkVersion,
        String seInfo,String abi,String instructionSet,String appDataDir,
        String invokeWith,String[] zygoteArgs) {
    try {
        return startViaZygote(processClass, niceName, uid, gid, gids,
                runtimeFlags, mountExternal, targetSdkVersion, seInfo,
                abi, instructionSet, appDataDir, invokeWith, false /* startChildZygote */,
                zygoteArgs);
    } catch{
        //...
    }
}

private Process.ProcessStartResult startViaZygote(params...)throws ZygoteStartFailedEx {
    ArrayList<String> argsForZygote = new ArrayList<String>();

    //為zygote進(jìn)程添加各種參數(shù)...
    argsForZygote.add("--runtime-args");
    argsForZygote.add("--setuid=" + uid);
    argsForZygote.add("--setgid=" + gid);
    //省略...

    //這里加了鎖,同一時(shí)間內(nèi)只允許一條線程執(zhí)行創(chuàng)建進(jìn)程的操作
    synchronized(mLock) {
        return zygoteSendArgsAndGetResult(openZygoteSocketIfNeeded(abi), argsForZygote);
    }
}

/**
 * 把新進(jìn)程的參數(shù)發(fā)給zygote進(jìn)程,它會(huì)創(chuàng)建一個(gè)子進(jìn)程,并返回子進(jìn)程的pid
 *
 */
@GuardedBy("mLock")
private static Process.ProcessStartResult zygoteSendArgsAndGetResult(
        ZygoteState zygoteState, ArrayList<String> args)
        throws ZygoteStartFailedEx {
    try {
        //這里的跨進(jìn)程通信,使用的是socket通信機(jī)制
        //由于這里都是在鎖的機(jī)制下執(zhí)行,所以不會(huì)出現(xiàn)并發(fā)錯(cuò)誤  
        final BufferedWriter writer = zygoteState.writer;
        final DataInputStream inputStream = zygoteState.inputStream;

        //把所有新進(jìn)程的參數(shù)都寫(xiě)入緩沖區(qū)
        writer.write(Integer.toString(args.size()));
        writer.newLine();

        for (int i = 0; i < sz; i++) {
            String arg = args.get(i);
            writer.write(arg);
            writer.newLine();
        }

        writer.flush();

        // Should there be a timeout on this?
        Process.ProcessStartResult result = new Process.ProcessStartResult();

        //讀取zygote進(jìn)程返回的值,這就是新進(jìn)程的pid
        result.pid = inputStream.readInt();
        result.usingWrapper = inputStream.readBoolean();

        if (result.pid < 0) {
            throw new ZygoteStartFailedEx("fork() failed");
        }
        return result;
    } 
}

zygote到底是何方神圣呢?其實(shí)在安卓系統(tǒng)啟動(dòng)的過(guò)程中,zygote進(jìn)程就會(huì)被啟動(dòng),它負(fù)責(zé)了整個(gè)frameworks層和application層的所有進(jìn)程的創(chuàng)建和啟動(dòng)工作。也就是說(shuō),所有的進(jìn)程都是它孕育出來(lái)的,都是它的子進(jìn)程。同時(shí),zygote的中文意思受精卵剛好與它的行為相符合。
需要注意的是,上面的代碼都是運(yùn)行在AMS內(nèi),只不過(guò)最后通過(guò)socket跨進(jìn)程通信的方式通知了zygote進(jìn)程來(lái)fork一個(gè)子進(jìn)程,并且獲取到了子進(jìn)程的pid。該子進(jìn)程創(chuàng)建、啟動(dòng)完畢之后,ActivityThread#main()方法就得到了調(diào)用。


10-1、ActivityThread#main()
ActivityThread的main()方法可以說(shuō)是我們應(yīng)用程序的開(kāi)端,它運(yùn)行在一個(gè)新的進(jìn)程空間內(nèi)。當(dāng)一個(gè)新的進(jìn)程啟動(dòng)完畢開(kāi)始運(yùn)行后,它首先要做的是通知AMS它被啟動(dòng)了,因?yàn)榇藭r(shí)AMS還等著它去執(zhí)行啟動(dòng)Activity的后續(xù)流程呢。我們來(lái)看看main()方法做了什么工作:

public static void main(String[] args) {
    //初始化環(huán)境
    Environment.initForCurrentUser();

    // Set the reporter for event logging in libcore
    EventLogger.setReporter(new EventLoggingReporter());

    // Make sure TrustedCertificateStore looks in the right place for CA certificates
    final File configDir = Environment.getUserConfigDirectory(UserHandle.myUserId());
    TrustedCertificateStore.setDefaultUserDirectory(configDir);

    Process.setArgV0("<pre-initialized>");

    //為主線程準(zhǔn)備Looper
    Looper.prepareMainLooper();

    //從命令行參數(shù)中獲取序列號(hào)
    long startSeq = 0;
    if (args != null) {
        for (int i = args.length - 1; i >= 0; --i) {
            if (args[i] != null && args[i].startsWith(PROC_START_SEQ_IDENT)) {
                startSeq = Long.parseLong(
                        args[i].substring(PROC_START_SEQ_IDENT.length()));
            }
        }
    }
    //創(chuàng)建ActivityThread的實(shí)例
    ActivityThread thread = new ActivityThread();
    thread.attach(false, startSeq);    //通知AMS進(jìn)行綁定操作

    if (sMainThreadHandler == null) {
        sMainThreadHandler = thread.getHandler();
    }

    Looper.loop();      //開(kāi)啟主線程的消息循環(huán)

    throw new RuntimeException("Main thread loop unexpectedly exited");
}

代碼的邏輯很清晰,關(guān)鍵的地方上面也有注釋??梢钥闯?,在main()函數(shù)的最后,開(kāi)啟了主線程的消息循環(huán),通過(guò)Handler和Looper的組合,可以不斷地處理AMS、WMS發(fā)過(guò)來(lái)的消息請(qǐng)求等,有關(guān)主線程消息循環(huán)的內(nèi)容,有興趣的可以自行查閱相關(guān)的信息,這里不做展開(kāi)講述。我們的關(guān)注點(diǎn)放在thread.attach(false,startSeq)這行代碼內(nèi),我們看看它做了什么工作吧。

10-2、ActivityThread#attach(params..)

private void attach(boolean system, long startSeq) {
    sCurrentActivityThread = this;
    mSystemThread = system;
    if (!system) {
        //獲取AMS在客戶端的代理對(duì)象
        final IActivityManager mgr = ActivityManager.getService();
        try {
            //進(jìn)行跨進(jìn)程通信,通知AMS進(jìn)行綁定操作
            //這里的mAppThread就是ApplicationThread,在ActivityThread
            //被實(shí)例化的時(shí)候,它也被實(shí)例化了。
            mgr.attachApplication(mAppThread, startSeq);
        } catch (RemoteException ex) {
            throw ex.rethrowFromSystemServer();
        }
        
    } else {
        //...
    }
    //...
}

上面的代碼出現(xiàn)了ApplicationThread對(duì)象,它在前面已經(jīng)出現(xiàn)過(guò)很多次了,它是一個(gè)Binder對(duì)象,用于AMS來(lái)跨進(jìn)程與APP進(jìn)行消息通信。這里通過(guò)Binder跨進(jìn)程通信,調(diào)用了AMS的attachApplication(params..)方法。我們?cè)俅未蜷_(kāi)AMS的代碼,找到該方法。(需要注意的是:應(yīng)用程序的主線程執(zhí)行完該方法之后,繼續(xù)進(jìn)行消息循環(huán),以等待下一次AMS的消息。)

10-3、ActivityManagerService#attachApplication(params..)

@Override
public final void attachApplication(IApplicationThread thread, long startSeq) {
    synchronized (this) {
        //..
        attachApplicationLocked(thread, callingPid, callingUid, startSeq);
    }
}

private final boolean attachApplicationLocked(IApplicationThread thread,
        int pid, int callingUid, long startSeq) {
    ProcessRecord app;
    long startTime = SystemClock.uptimeMillis();
    //根據(jù)pid來(lái)獲取進(jìn)程記錄
    if (pid != MY_PID && pid >= 0) {
        synchronized (mPidsSelfLocked) {
            app = mPidsSelfLocked.get(pid);
        }
    } else {
        app = null;
    }

    //ProcessRecord保存了當(dāng)前的IApplicationThread,即保存了客戶端的一個(gè)代理對(duì)象
    //AMS能根據(jù)該Binder對(duì)象快速找到所指的應(yīng)用
    app.makeActive(thread, mProcessStats);  
    
    //省略大部分代碼...

        if (app.isolatedEntryPoint != null) {
            //...
        } else if (app.instr != null) {
            //代碼11-1、跨進(jìn)程調(diào)用ApplicationThread的方法,告訴APP端有關(guān)該進(jìn)程的信息
            thread.bindApplication(processName, appInfo, providers,
                    app.instr.mClass,
                    profilerInfo, app.instr.mArguments,
                    app.instr.mWatcher,
                    app.instr.mUiAutomationConnection, testMode,
                    mBinderTransactionTrackingEnabled, enableTrackAllocation,
                    isRestrictedBackupMode || !normalMode, app.persistent,
                    new Configuration(getGlobalConfiguration()), app.compat,
                    getCommonServicesLocked(app.isolated),
                    mCoreSettingsObserver.getCoreSettingsLocked(),
                    buildSerial, isAutofillCompatEnabled);
            } else {
                //...
            }
            
        } 

    // See if the top visible activity is waiting to run in this process...
    if (normalMode) {
        try {
            //代碼12-1、告訴ActivityStackSupervisor,該app已經(jīng)完成了綁定操作,可以啟動(dòng)一個(gè)Activity了
            if (mStackSupervisor.attachApplicationLocked(app)) {
                didSomething = true;
            }
        } 
    }
    return true;
}

上面已經(jīng)省略了大部分的代碼,很多都是異常狀態(tài)的處理以及初始化等邏輯,核心在于thread.bindApplication(params..)mStackSupervisor.attachApplicationLocked(app)這兩個(gè)方法的調(diào)用上。前一行代碼通過(guò)IApplicationThread跨進(jìn)程通信,調(diào)用了APP端的相應(yīng)方法,把有關(guān)進(jìn)程的重要信息傳遞了過(guò)去。這樣便完成從客戶端到服務(wù)端的綁定操作。后一行代碼,通過(guò)ActivityStackSupervisor來(lái)找到對(duì)應(yīng)的ActivityStack,然后進(jìn)行綁定,這樣便完成了從服務(wù)端到客戶端的綁定操作。通過(guò)這兩個(gè)操作,客戶端的應(yīng)用程序知道了自己的應(yīng)用信息、進(jìn)程信息等;而服務(wù)端則知道了客戶端的Binder代理對(duì)象,方便之后的跨進(jìn)程操作。


11-1、ApplicationThread#bindApplication(params..)
我們先來(lái)看該方法的調(diào)用,我們又從AMS進(jìn)程回到了應(yīng)用進(jìn)程:

public final void bindApplication(params..) {

    if (services != null) {

        // Setup the service cache in the ServiceManager
        ServiceManager.initServiceCache(services);
    }

    setCoreSettings(coreSettings);

    AppBindData data = new AppBindData();
    data.processName = processName;
    data.appInfo = appInfo;
    data.providers = providers;
    //省略賦值代碼..
        
    //通過(guò)Handler發(fā)送消息
    sendMessage(H.BIND_APPLICATION, data);
}

由此可見(jiàn),App的有關(guān)信息從AMS傳遞了過(guò)來(lái),并保存在了AppBindData這個(gè)對(duì)象內(nèi)。接著,就是我們熟悉的發(fā)送消息過(guò)程,通過(guò)Handler切換到主線程,在主線程內(nèi)處理這個(gè)消息。代碼如下:

public void handleMessage(Message msg) {
    switch (msg.what) {
        case BIND_APPLICATION:
            Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER, "bindApplication");
            AppBindData data = (AppBindData)msg.obj;
            handleBindApplication(data);
            Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER);
            break;        
    }
    Object obj = msg.obj;
    if (obj instanceof SomeArgs) {
        ((SomeArgs) obj).recycle();
    }
}

得益于主線程的消息循環(huán),當(dāng)H接受到BIND_APPLICATION的消息時(shí),就能馬上開(kāi)始處理這個(gè)消息,處理完畢后繼續(xù)消息循環(huán)。

11-2、ActivityThread#handleBindApplication(data)

private void handleBindApplication(AppBindData data) {
    //省略大部分代碼...

    //創(chuàng)建上下文環(huán)境context
    final ContextImpl appContext = ContextImpl.createAppContext(this, data.info);
        
    Application app;
    try {
        app = data.info.makeApplication(data.restrictedBackupMode, null);
        
        //....
        try {
            mInstrumentation.callApplicationOnCreate(app);
        }
    }
}

以上省略了絕大部分的代碼,很多都是初始化代碼,比如加載各種庫(kù)等。當(dāng)Application初始化完畢之后,調(diào)用了mInstrumentation.callApplicationOnCreate(app)。

11-3、Instrumentation#callApplicationOnCreate(app)

public void callApplicationOnCreate(Application app) {
        app.onCreate();
    }

很簡(jiǎn)單,調(diào)用了Application#onCreate()方法,也就是我們業(yè)務(wù)層常重寫(xiě)的方法之一,代碼執(zhí)行到這里,應(yīng)用程序的初始化已經(jīng)完成了。下面就是在應(yīng)用程序的基礎(chǔ)上啟動(dòng)一個(gè)Activity了。


12-1、ActivityStackSupervisor#attachApplicationLocked(app)
回到10-3的代碼,繼續(xù)往下執(zhí)行,接著AMS就會(huì)調(diào)用mStackSupervisor.attachApplicationLocked(app)方法,可想而知,在方法的內(nèi)部,應(yīng)該是要啟動(dòng)一個(gè)Activity了。因?yàn)橐磺械臏?zhǔn)備工作都已經(jīng)完成了。

boolean attachApplicationLocked(ProcessRecord app) throws RemoteException {
    final String processName = app.processName;
    boolean didSomething = false;
    for (...) {
        for (...) {
            for (int i = 0; i < size; i++) {
                final ActivityRecord activity = mTmpActivityList.get(i);

                //如果該ActivityRecord的進(jìn)程字段為空 并且進(jìn)程uid與Activity的進(jìn)程id相同
                //并且 進(jìn)程名字與Activity的進(jìn)程名字相同
                if (activity.app == null && app.uid == activity.info.applicationInfo.uid
                        && processName.equals(activity.processName)) {
                    try {
                        //啟動(dòng)該Activity
                        if (realStartActivityLocked(activity, app,
                                top == activity /* andResume */, true /* checkConfig */)) {
                            didSomething = true;
                        }
                    } 
                }
            }
        }
    }
    return didSomething;
}

上面代碼的邏輯主要是遍歷所有的任務(wù)棧,找到活躍的任務(wù)棧后,再在其中找到需要啟動(dòng)的Activity,將它啟動(dòng)。啟動(dòng)的邏輯放在了realStartActivityLocked(params..),終于,我們又看到了這個(gè)方法,殊途同歸。

12-2、ActivityStackSupervisor#realStartActivityLocked(params..)

final boolean realStartActivityLocked(ActivityRecord r, ProcessRecord app,
        boolean andResume, boolean checkConfig) throws RemoteException {

    //這里進(jìn)行了判斷,如果有Activity處于未暫停的狀態(tài),則不能啟動(dòng)一個(gè)新的Activity
    //由于我們是從客戶端通知server來(lái)啟動(dòng)一個(gè)Activity的,因此已經(jīng)不存在未暫停的Activity了
    if (!allPausedActivitiesComplete()) {   
        return false;
    }

    final TaskRecord task = r.getTask();
    final ActivityStack stack = task.getStack();

    try {
            //創(chuàng)建一個(gè)客戶端的事務(wù)
            final ClientTransaction clientTransaction = ClientTransaction.obtain(app.thread,
                    r.appToken);
            //添加callback,留意這里的添加了LaunchActivityItem
            clientTransaction.addCallback(LaunchActivityItem.obtain(new Intent(r.intent),
                    System.identityHashCode(r), r.info,
                    mergedConfiguration.getGlobalConfiguration(),
                    mergedConfiguration.getOverrideConfiguration(), r.compat,
                    r.launchedFromPackage, task.voiceInteractor, app.repProcState, r.icicle,
                    r.persistentState, results, newIntents, mService.isNextTransitionForward(),
                    profilerInfo));

            //為該事務(wù)的目標(biāo)設(shè)置為ResumeActivityItem,即啟動(dòng)一個(gè)Activity,并改變它
            //的生命周期到Resumed狀態(tài)
            final ActivityLifecycleItem lifecycleItem;
            if (andResume) {
                lifecycleItem = ResumeActivityItem.obtain(mService.isNextTransitionForward());
            } 
            clientTransaction.setLifecycleStateRequest(lifecycleItem);

            //通過(guò)事務(wù)管理器執(zhí)行一個(gè)事務(wù)
            mService.getLifecycleManager().scheduleTransaction(clientTransaction);
        } 
    return true;
}

可以看到,我們?cè)俅斡龅搅耸煜さ?code>ClientTransaction,前面解析暫停Activity時(shí)也遇到它,那么接下來(lái)的邏輯應(yīng)該就是與暫停的邏輯差不多了,只不過(guò)現(xiàn)在的ActivityLifecycleItem變成了ResumeActivityItem,即Activity的目標(biāo)狀態(tài)是resumed。接下來(lái)的調(diào)用鏈與前面見(jiàn)過(guò)的是一致的,即:ClientLifecycleManager#scheduleTransaction(clientTransaction)
——>ClientTransaction.schedule()
——>IApplicationThread.scheduleTransaction(this)
——>ActivityThread#scheduleTransaction(transaction)
——>H#handleMessage(msg)
——>TransactionExecutor#execute(transaction)
其中,通過(guò)IApplicationThread這個(gè)Binder對(duì)象進(jìn)行了跨進(jìn)程調(diào)用,調(diào)用了APP端的方法,此時(shí)從AMS進(jìn)程切換到了我們的應(yīng)用進(jìn)程。緊接著,通過(guò)Handler機(jī)制切換到了主線程,并在主線程處理EXECUTE_TRANSACTION這個(gè)消息,接著進(jìn)一步交給TransactionExecutor來(lái)處理這個(gè)事務(wù)。


13-1、TransactionExecutor#execute(transaction)
在代碼7-1已經(jīng)介紹過(guò)這個(gè)方法了,我們?cè)賮?lái)簡(jiǎn)單看一下就行:

    public void execute(ClientTransaction transaction) {
        final IBinder token = transaction.getActivityToken();
        log("Start resolving transaction for client: " + mTransactionHandler + ", token: " + token);

        executeCallbacks(transaction);

        executeLifecycleState(transaction);
        mPendingActions.clear();
        log("End resolving transaction");
    }

在代碼12-2中,我們有留意到初始化clientTransaction時(shí),為它添加了一個(gè)callback,即LaunchActivityItem,那么這里首先會(huì)執(zhí)行executeCallbacks(transaction)方法。

13-2、TransactionExecutor#executeCallbacks(transaction)

public void executeCallbacks(ClientTransaction transaction) {
    final List<ClientTransactionItem> callbacks = transaction.getCallbacks();
    if (callbacks == null) {
        // No callbacks to execute, return early.
        return;
    }
    log("Resolving callbacks");

    final IBinder token = transaction.getActivityToken();
    ActivityClientRecord r = mTransactionHandler.getActivityClient(token);

    //根據(jù)前面的代碼,這里的size為1
    final int size = callbacks.size();
    for (int i = 0; i < size; ++i) {
        final ClientTransactionItem item = callbacks.get(i);
        log("Resolving callback: " + item);

        //這里的Item實(shí)際上就是LaunchActivityItem.
        item.execute(mTransactionHandler, token, mPendingActions);
        item.postExecute(mTransactionHandler, token, mPendingActions);

        //...
    }
}

在方法內(nèi)部調(diào)用了LaunchActivityItem的相關(guān)方法,其中關(guān)鍵是LaunchActivityItem#execute(params..)

13-3、LaunchActivityItem#execute(params..)

public void execute(ClientTransactionHandler client, IBinder token,
        PendingTransactionActions pendingActions) {
    Trace.traceBegin(TRACE_TAG_ACTIVITY_MANAGER, "activityStart");
    //實(shí)例化一個(gè)ActivityClientRecord
    ActivityClientRecord r = new ActivityClientRecord(token, mIntent, mIdent, mInfo,
            mOverrideConfig, mCompatInfo, mReferrer, mVoiceInteractor, mState, mPersistentState,
            mPendingResults, mPendingNewIntents, mIsForward,
            mProfilerInfo, client);
    //實(shí)際上調(diào)用的是ActivityThread的handleLaunchActivity方法
    client.handleLaunchActivity(r, pendingActions, null /* customIntent */);
    Trace.traceEnd(TRACE_TAG_ACTIVITY_MANAGER);
}

這里的ClientTransactionHandlerActivityThread的父類,而ActivityThread重寫(xiě)了該方法,因此我們到ActivityThread尋找該方法。

13-4、ActivityThread#handleLaunchActivity(params..)

public Activity handleLaunchActivity(ActivityClientRecord r,
        PendingTransactionActions pendingActions, Intent customIntent) {
    //....

    final Activity a = performLaunchActivity(r, customIntent);

    //...

    return a;
}

private Activity performLaunchActivity(ActivityClientRecord r, Intent customIntent) {
    
    //省略部分代碼..

    ActivityInfo aInfo = r.activityInfo;
    ContextImpl appContext = createBaseContextForActivity(r);   //創(chuàng)建Context
    Activity activity = null;
    try {
        java.lang.ClassLoader cl = appContext.getClassLoader();
        activity = mInstrumentation.newActivity(
                cl, component.getClassName(), r.intent);    //創(chuàng)建一個(gè)新的Activity
        StrictMode.incrementExpectedActivityCount(activity.getClass());
        r.intent.setExtrasClassLoader(cl);
        r.intent.prepareToEnterProcess();
        if (r.state != null) {
            r.state.setClassLoader(cl);
        }
    } 

    try {
        Application app = r.packageInfo.makeApplication(false, mInstrumentation);

        if (activity != null) {
            appContext.setOuterContext(activity);
            //activity綁定application
            activity.attach(appContext, this, getInstrumentation(), r.token,
                    r.ident, app, r.intent, r.activityInfo, title, r.parent,
                    r.embeddedID, r.lastNonConfigurationInstances, config,
                    r.referrer, r.voiceInteractor, window, r.configCallback);

            
            if (r.isPersistable()) {
                //前面創(chuàng)建了Activity,接下來(lái)觸發(fā)它的生命周期方法
                mInstrumentation.callActivityOnCreate(activity, r.state, r.persistentState);
            } else {
                mInstrumentation.callActivityOnCreate(activity, r.state);
            }

            r.activity = activity;
        }
        r.setState(ON_CREATE);  //設(shè)置Activity此時(shí)的狀態(tài)為onCreate

        mActivities.put(r.token, r);

    return activity;
}

經(jīng)過(guò)一系列的創(chuàng)建、初始化過(guò)程,終于到了Instrumentation#callActivityOnCreate(params..),顯然,這里就是觸發(fā)Activity生命周期方法的地方了。

13-5、Instrumentation#callActivityOnCreate(params..)

public void callActivityOnCreate(Activity activity, Bundle icicle) {
     prePerformCreate(activity);
     activity.performCreate(icicle);
     postPerformCreate(activity);
}

沒(méi)什么好說(shuō)的,下一步就是Activity#performCreate(bundle)

final void performCreate(Bundle icicle) {
    performCreate(icicle, null);
}

final void performCreate(Bundle icicle, PersistableBundle persistentState) {
    mCanEnterPictureInPicture = true;
    restoreHasCurrentPermissionRequest(icicle);
    if (persistentState != null) {
        onCreate(icicle, persistentState);  
    } else {
        onCreate(icicle);   //onCreate()生命周期方法調(diào)用
    }
    writeEventLog(LOG_AM_ON_CREATE_CALLED, "performCreate");
    mActivityTransitionState.readState(icicle);

    mVisibleFromClient = !mWindow.getWindowStyle().getBoolean(
            com.android.internal.R.styleable.Window_windowNoDisplay, false);
    mFragments.dispatchActivityCreated();   //告訴Fragment分發(fā)create事件
    mActivityTransitionState.setEnterActivityOptions(this, getActivityOptions());
}

最后,終于來(lái)到了Activity#onCreate()方法,也這就是我們應(yīng)用Activity默認(rèn)重寫(xiě)的一個(gè)方法。到了這一步,一個(gè)Activity終于真正地創(chuàng)建、啟動(dòng)成功了。但還沒(méi)有完成,因?yàn)槲覀兊哪繕?biāo)狀態(tài)是resumed,所以我們還要把Activity的狀態(tài)逐步切換到onResume狀態(tài)。
讓我們回到代碼13-1的executeLifecycleState(transaction),這個(gè)方法讀者應(yīng)該也是熟悉的了,因?yàn)樵谔幚?code>pause狀態(tài)時(shí)也曾經(jīng)遇到過(guò)了。那么接下來(lái)的邏輯就顯而易見(jiàn)了,具體的邏輯就在代碼7-2處,只不過(guò)現(xiàn)在的狀態(tài)路徑變成了:onStart和onResume,也就是會(huì)分別調(diào)用ActivityThread#handleStartActivityActivityThread#handleResumeActivity;接著進(jìn)一步調(diào)用到Activity#performStart()Activity#performResume()。最后,我們熟悉的生命周期方法onStart()onResume()都會(huì)得到調(diào)用。

本文到這里就告一段落了,整篇文章很長(zhǎng),為耐心看到這里的你點(diǎn)贊~希望這篇文章能對(duì)您有所裨益,謝謝閱讀!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容