Activity啟動分析(一)--ActivityThread

yangxi_001發表於2014-02-26

1. 入口。

以前一直都說Activity的人口是onCreate方法。其實android上一個應用的入口,應該是ActivityThread。和普通的java類一樣,入口是一個main方法。

public static final void main(String[] args) {
        SamplingProfilerIntegration.start();
       ……
        Looper.prepareMainLooper();
        if (sMainThreadHandler == null) {
            sMainThreadHandler = new Handler();
        }
        ActivityThread thread = new ActivityThread();
        thread.attach(false);
       ……
        Looper.loop();
       ……
        thread.detach();
        ……
        Slog.i(TAG, "Main thread of " + name + " is now exiting");
    }

下面仔細分析一下這個main方法。


2.Looper.prepareMainLooper();

ActivityThread其實就是我們經常說的UI thread,也就是主執行緒。我們都知道主執行緒可以使用Handler進行非同步通訊,因為主執行緒中已經建立了Looper,而這個Looper就是在這裡建立的。如果其他執行緒需要使用Handler通訊,就要自己去建立Looper。


3. sMainThreadHandler = new Handler();

建立一個Handler。


4. ActivityThread thread = new ActivityThread();

建立ActivityThread 物件。

ActivityThread 有幾個比較重要的成員變數,會在建立ActivityThread物件時初始化。

(1)final ApplicationThread mAppThread = new ApplicationThread();

ApplicationThread繼承自ApplicationThreadNative, 而ApplicationThreadNative又繼承自Binder並實現了IApplicationThread介面。IApplicationThread繼承自IInterface。這是一個很明顯的binder結構,用於於Ams通訊。IApplicationThread介面定義了對一個程式(linux的程式)操作的介面。ApplicationThread通過binder與Ams通訊,並將Ams的呼叫,通過下面的H類(也就是Hnalder)將訊息傳送到訊息佇列,然後進行相應的操作,入activity的start, stop。

(2)final H mH = new H();

          private final class H extends Handler

mH負責處理ApplicationThread傳送到訊息佇列的訊息,例如:

public void handleMessage(Message msg) {
            if (DEBUG_MESSAGES) Slog.v(TAG, ">>> handling: " + msg.what);
            switch (msg.what) {
                case LAUNCH_ACTIVITY: {
                    ActivityClientRecord r = (ActivityClientRecord)msg.obj;

                    r.packageInfo = getPackageInfoNoCheck(
                            r.activityInfo.applicationInfo);
                    handleLaunchActivity(r, null);
                } break;


5. handleLaunchActivity(r, null);

從名字中就可以看出,這裡就將進行啟動activity的工作了。

方法中主要呼叫了這一句:

Activity a = performLaunchActivity(r, customIntent);


6. performLaunchActivity()

進行了一些初始化和賦值操作後,建立activity。

activity = mInstrumentation.newActivity(
                    cl, component.getClassName(), r.intent);

然後呼叫:

mInstrumentation.callActivityOnCreate(activity, r.state);

這一句就會呼叫到acitivity的onCreate方法了,就進入了大多數應用開發的入口了。

相關文章