ActivityGroup詳解

本文轉載自http://blog.csdn.net/caowenbin/article/details/5876019

此前,我們對Activity進行了一些學習,在Android中,還提供了一個ActivityGroup類,該類是Activity的容器,可以包含多個嵌套進來的Activitys,我們接下來依然採用源碼分析的方式來了解該類的內部實現。

首先,從SDK中和源碼中都可以獲知,ActivityGroup類的父類是Activity,也就是說二者具有相同的接口和生命週期,同Activity一樣,也有onCreate()、onPause()等函數可供我們重載。

在ActivityGroup的源碼中有成員變量

protected LocalActivityManager mLocalActivityManager;

該變量在ActivityGroup的構造函數中創建並初始化,可見,ActivityGroup的功能實現肯定是要委託給這個對象來完成了。爲了給用戶開放對此對象的訪問,ActivityGroup提供了

    public final LocalActivityManager getLocalActivityManager() {

        return mLocalActivityManager;

    }

通過瀏覽ActivityGroup的源碼可以發現,幾乎全部是以通過LocalActivityManager對象來完成的具體動作,比如:

    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);

        Bundle states = savedInstanceState != null

                ? (Bundle) savedInstanceState.getBundle(STATES_KEY) : null;

        mLocalActivityManager.dispatchCreate(states);

}

 

下面,我們就來看一下LocalActivityManager的源碼。

在該類中,提供了一個私有類

    private static class LocalActivityRecord extends Binder {

        LocalActivityRecord(String _id, Intent _intent) {

            id = _id;

            intent = _intent;

        }

 

        final String id;                // Unique name of this record.

        Intent intent;                  // Which activity to run here.

        ActivityInfo activityInfo;      // Package manager info about activity.

        Activity activity;              // Currently instantiated activity.

        Window window;                  // Activity's top-level window.

        Bundle instanceState;           // Last retrieved freeze state.

        int curState = RESTORED;        // Current state the activity is in.

    }

用於保存Activity的信息,並提供了

    private final Map<String, LocalActivityRecord> mActivities

            = new HashMap<String, LocalActivityRecord>();

    private final ArrayList<LocalActivityRecord> mActivityArray

            = new ArrayList<LocalActivityRecord>();

採用這樣的數據結構用於對所有嵌入的子Activity信息進行保存處理。其中前者用於通過String快速查找,後者用於以數組的方式快速訪問,是典型的以空間換時間的的方式。

    public void dispatchCreate(Bundle state) {

        if (state != null) {

            final Iterator<String> i = state.keySet().iterator();

            while (i.hasNext()) {

                try {

                    final String id = i.next();

                    final Bundle astate = state.getBundle(id);

                    LocalActivityRecord r = mActivities.get(id);

                    if (r != null) {

                        r.instanceState = astate;

                    } else {

                        r = new LocalActivityRecord(id, null);

                        r.instanceState = astate;

                        mActivities.put(id, r);

                        mActivityArray.add(r);

                    }

                } catch (Exception e) {

……

                }

            }

        }

       

        mCurState = CREATED;

    }

從這裏我們可以看出,當有一個ActivityGroup被Create的時候,就會有對應的Activity信息被保存到數組中。

當我們調用LocalActivityManager的startActivity()以產生Window的時候,我們也可以看到

public Window startActivity(String id, Intent intent) {

                   ……

        LocalActivityRecord r = mActivities.get(id);

        if (r == null) {

            r = new LocalActivityRecord(id, intent);

            adding = true;

        }

                   ……

        if (adding) {

            mActivities.put(id, r);

            mActivityArray.add(r);

        }

        ……

    }

有了這個數組,就可以遍歷到ActivityGroup中嵌入的Activitys了,從而可以實現ActivityGroup的功能。

以上的分析結果產生的類圖如下:

 

 

發佈了22 篇原創文章 · 獲贊 9 · 訪問量 12萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章