此前,咱們對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;
}
從這裏咱們能夠看出,當有一個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的功能。
以上的分析結果產生的類圖以下: