本文轉載自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的功能。
以上的分析結果產生的類圖如下: