ActivityThread

我們學(xué)習(xí) Android 過程中會(huì)發(fā)現(xiàn),我們的文件都是 .java 文件,也就是說 Android 開發(fā)還是用的 Java 語言來編寫的。也正是這樣,所以你們來學(xué) Android ,也會(huì)讓你們先學(xué)習(xí)一段時(shí)間 Java 。掌握好了 Java 的相關(guān)知識(shí),學(xué)起 Android 來可謂是事半功倍。好了,你們是不是感覺有點(diǎn)扯遠(yuǎn)了啊,不是說好講 ActivityThread 類的么,其實(shí)并不如此。

你們?cè)趧傞_始從 Java 學(xué)習(xí)轉(zhuǎn)到 Android 學(xué)習(xí)的過程中,有一個(gè)重大的改變不知道你們又沒有發(fā)現(xiàn)。那就是 Java 中的 main() 方法,程序的入口不見了,取而代之的是 onCreate() 方法。你們沒有一點(diǎn)疑惑么?初學(xué)階段直接無腦接受是對(duì)的,但是作為一個(gè)工作幾年了的人來說,就有必要去深入研究一下了。明明 Android 也就是 Java 語言也編寫的,差別咋就這么大呢?

其實(shí)呢, Android 中還是有 main() 方法的,只是隱藏的比較深而已。今天,就由我 AIqingfeng 來帶你們一探究竟~!

我們先找到 ActivityThread 這個(gè)類,看一下注釋(較少,值得一看):

This manages the execution of the main thread in an
application process, scheduling and executing activities,
broadcasts, and other operations on it as the activity
manager requests.

翻譯一下就是:在 Application 進(jìn)程中管理執(zhí)行主線程,調(diào)度和執(zhí)行 活動(dòng)和廣播,和活動(dòng)管理請(qǐng)求的其它操作。

一、入口

Android 上一個(gè)應(yīng)用的入口,應(yīng)該是 ActivityThread 類,和普通的Java 類一樣,入口是一個(gè) main() 方法。

public static void main(String[] args) {
    // 看源碼很重要的一個(gè)能力就是‘眼中只有你’,認(rèn)不到的都忽略,看認(rèn)得到的
    ···
    // 創(chuàng)建主線程的Looper對(duì)象,發(fā)現(xiàn)和工作線程創(chuàng)建Looper對(duì)象調(diào)用的方法不一樣,這里先記下,以后在詳解。
    // 主線程原來也有Looper對(duì)象啊
    Looper.prepareMainLooper();

    // 這里創(chuàng)建了一個(gè)活動(dòng)線程,也就是我們的主線程。
    ActivityThread thread = new ActivityThread();
    thread.attach(false);

    // 如果主線程的Handler為空(可以看出,一個(gè)好的命名可讀性是多么高),那就為主線程創(chuàng)建一個(gè)Handler。
    // 然后我們還可以在主線程創(chuàng)建Handler,說明一個(gè)線程對(duì)應(yīng)多個(gè)Handler。多讀源碼,很多問題都得到了解決啊。
    if (sMainThreadHandler == null) {
        sMainThreadHandler = thread.getHandler();
    }
    Looper.loop();
    
    // 這里拋了個(gè)異常,主線程loop異常退出。說明主線程loop不能退出,這里和前面建立Looper對(duì)象的調(diào)用方法有關(guān)
    throw new RuntimeException("Main thread loop unexpectedly exited");
}

二、變量

好了,現(xiàn)在我們解決了我們開始的疑惑后,再來深度學(xué)習(xí)一下這個(gè)類的一些知識(shí)吧。

ActivityThread 有幾個(gè)比較重要的成員變量,會(huì)在創(chuàng)建ActivityThread對(duì)象時(shí)初始化。

final ApplicationThread mAppThread = new ApplicationThread();

ApplicationThread繼承自ApplicationThreadNative, 而ApplicationThreadNative又繼承自Binder并實(shí)現(xiàn)了IApplicationThread接口。IApplicationThread繼承自IInterface。這是一個(gè)很明顯的binder結(jié)構(gòu),用于與Ams通信。IApplicationThread接口定義了對(duì)一個(gè)程序(Linux的進(jìn)程)操作的接口。ApplicationThread通過binder與Ams通信,并將Ams的調(diào)用,通過下面的H類(也就是Hnalder)將消息發(fā)送到消息隊(duì)列,然后進(jìn)行相應(yīng)的操作,入activity的start, stop。

final H mH = new H();

這個(gè) H 大家首先會(huì)想到什么啊,不要開車哈。看到 H 想到了 Handler 。發(fā)現(xiàn) HActivityThread 內(nèi)部類,繼承自 Handler ,果然沒錯(cuò)。所以大家遇到不清楚的,不要怕,大膽的猜測(cè)一下。Handler 最重要的的也就是 handleMessage() 方法了。查看一下其方法:

ActivityThread.java

public void handleMessage(Message ms ) {
    switch (msg.what) {
        // 呀哈,這些看著和 onCreate() 、onResume() 、onStop() 方法有很大關(guān)系啊。
        case LAUNCH_ACTIVITY: {
            // 處理加載活動(dòng),這里進(jìn)去就可以得到答案啦。
            handleLaunchActivity(r, null, "LAUNCH_ACTIVITY");
        } break;
        case RESUME_ACTIVITY:
        case STOP_ACTIVITY:
    }
}

點(diǎn)進(jìn)來咯。 ActivityThread.java

private void handleLaunchActivity(···) {
    // 執(zhí)行加載活動(dòng),返回一個(gè)活動(dòng)對(duì)象。有興趣可以在進(jìn)去看看。
    Activity a = performLaunchActivity(r, custonIntent);
}

興趣是最好的老師。ActivityThread.java

private Activity performLaunchActivity(···) {
    Activity activity = null;
    try {
         // 活動(dòng)在這里被創(chuàng)建,還可以進(jìn)去看看。認(rèn)不到的單詞google一下,Instrumentation : 儀器。
         activity = mInstrumentation.newActivity(···);
    }
    if (r.isPersistable()) {
                    // 看名字就感覺調(diào)用了 Activity 的 onCreate() 方法
                    mInstrumentation.callActivityOnCreate(activity, r.state, r.persistentState);
                } else {
                    mInstrumentation.callActivityOnCreate(activity, r.state);
                }
}

先探索一下 Activity 創(chuàng)建這條路吧。最底層啦。Instrumentation.java

public Activity newActivity(ClassLoader cl, String className, Intent intent) throws InstantiationException, illegalAccessException, ClassNotFoundException {
    // 類加載器根據(jù)類名創(chuàng)建了一個(gè)實(shí)例。再下去就是native方法了。
    return (Activity) cl.loadClass(className).newInstance();
}

Native方法,C語言啦,活動(dòng)創(chuàng)建之路結(jié)束了。Class.java

public native T newInstance() throws InstantiationException, IllegalAccessException;

再來看看 Activity 中 onCreate() 方法執(zhí)行之路吧。 Instrumentation.java

public void callActivityOnCreate(Activity activity, Bundle icicle,
            PersistableBundle persistentState) {
        // pre: 前,執(zhí)行 Create 操作之前
        prePerformCreate(activity);
        // 執(zhí)行 Create 操作
        activity.performCreate(icicle, persistentState);
        postPerformCreate(activity);
    }

到了 Activity 了,哪里我們自己 Activity 還遠(yuǎn)么~! Activity.java

final void performCreate(Bundle icicle) {
        restoreHasCurrentPermissionRequest(icicle);
        // 哼哼,終于找到你了,onCreate() 方法。
        onCreate(icicle);
        mActivityTransitionState.readState(icicle);
        performCreateCommon();
    }

來,仔細(xì)瞅瞅~! Activity.java

@MainThread // 主線程
@CallSuper // 必須調(diào)用super.onCreate(bundle);
protected void onCreate(@Nullable Bundle savedInstanceState) {
            // 看這里,是不是我們恢復(fù)數(shù)據(jù)那些操作啊,看看源碼怎么寫的~!
            if (savedInstanceState != null) {
            Parcelable p = savedInstanceState.getParcelable(FRAGMENTS_TAG);
            // Activity 中管理的 Fragment
            mFragments.restoreAllState(p, mLastNonConfigurationInstances != null
                    ? mLastNonConfigurationInstances.fragments : null);
        }
       // 分發(fā) Create 操作
        mFragments.dispatchCreate();
}
最后編輯于
?著作權(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)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

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

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