ActivityGroup是如何對嵌入的Activitys進行管理的

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

首先,從SDK中和源碼中均可以獲知,ActivityGroup類的父類是Activity,也就是說兩者具備相同的接口和生命週期,同Activity同樣,也有onCreate()onPause()等函數可供咱們重載。數據結構

ActivityGroup的源碼中有成員變量函數

protected LocalActivityManager mLocalActivityManager;源碼分析

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

    public final LocalActivityManager getLocalActivityManager() {this

        return mLocalActivityManager;spa

    }對象

經過瀏覽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;

    }

從這裏咱們能夠看出,當有一個ActivityGroupCreate的時候,就會有對應的Activity信息被保存到數組中。

當咱們調用LocalActivityManagerstartActivity()以產生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的功能。

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

 

相關文章
相關標籤/搜索