本文為個人學(xué)習(xí)筆記分享,沒有任何商業(yè)化行為,對其他文章的引用都會標(biāo)記。如有侵權(quán)行為,請及時提醒更正!如需轉(zhuǎn)載請表明出處
本文主要來源是 任玉剛大神的《Android開發(fā)藝術(shù)探索》
Android 的主線程就是ActivityTread,主線程的入口方法為main,在main方法中系統(tǒng)會通過Looper.prepareMainLooper()來創(chuàng)建主線程的Looper以及MeesageQueue,并通過Looper.loop()來開啟主線程的消息循環(huán),這個過程如下所示。
public static void main(String[] args) {
Looper.prepareMainLooper();
ActivityThread thread = new ActivityThread();
thread.attach(false);
if (sMainThreadHandler == null) {
sMainThreadHandler = thread.getHandler();
}
Looper.loop();
throw new RuntimeException("Main thread loop unexpectedly exited");
}
主線程的消息循環(huán)開始了以后,ActivityTread還需要一個Handler來和消息隊列進(jìn)行交互,這個Handler就是ActivityTread.H,它內(nèi)部定義了一組消息類型,主要包含了四大組件的啟動和停止過程,如下所示。
private class H extends Handler {
public static final int LAUNCH_ACTIVITY = 100;
public static final int PAUSE_ACTIVITY = 101;
public static final int PAUSE_ACTIVITY_FINISHING= 102;
public static final int STOP_ACTIVITY_SHOW = 103;
public static final int STOP_ACTIVITY_HIDE = 104;
public static final int SHOW_WINDOW = 105;
public static final int HIDE_WINDOW = 106;
public static final int RESUME_ACTIVITY = 107;
public static final int SEND_RESULT = 108;
public static final int DESTROY_ACTIVITY = 109;
public static final int BIND_APPLICATION = 110;
public static final int EXIT_APPLICATION = 111;
public static final int NEW_INTENT = 112;
public static final int RECEIVER = 113;
public static final int CREATE_SERVICE = 114;
public static final int SERVICE_ARGS = 115;
public static final int STOP_SERVICE = 116;
......
}
ActivityThread通過ApplicationThread和AMS進(jìn)行進(jìn)程間通訊,AMS以進(jìn)程間通訊的方式完成ActivityThread的請求后會回調(diào)ApplicationThread中的Binder方法,然后ApplicationThread會向H發(fā)消息,H收到消息后會將ApplicationThread中的邏輯切換到ActivityThread去執(zhí)行,即切換到主線程去執(zhí)行,這個過程就是主線程的消息循環(huán)模型。
整理寫作不易,請小伙伴多多支持,麻煩請點贊關(guān)注支持一下,??????。