天天看點

Android 五個線程依次列印,10分鐘掌握Android消息機制(五)主線程的消息循環

本文為個人學習筆記分享,沒有任何商業化行為,對其他文章的引用都會标記。如有侵權行為,請及時提醒更正!如需轉載請表明出處

本文主要來源是 任玉剛大神的《Android開發藝術探索》

Android 的主線程就是ActivityTread,主線程的入口方法為main,在main方法中系統會通過Looper.prepareMainLooper()來建立主線程的Looper以及MeesageQueue,并通過Looper.loop()來開啟主線程的消息循環,這個過程如下所示。

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");

}

主線程的消息循環開始了以後,ActivityTread還需要一個Handler來和消息隊列進行互動,這個Handler就是ActivityTread.H,它内部定義了一組消息類型,主要包含了四大元件的啟動和停止過程,如下所示。

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進行程序間通訊,AMS以程序間通訊的方式完成ActivityThread的請求後會回調ApplicationThread中的Binder方法,然後ApplicationThread會向H發消息,H收到消息後會将ApplicationThread中的邏輯切換到ActivityThread去執行,即切換到主線程去執行,這個過程就是主線程的消息循環模型。

整理寫作不易,請小夥伴多多支援,麻煩請點贊關注支援一下,😘😘😘。