Android源码学习之四-ActivityGroup是如何对嵌入的Activitys进行管理的 .
Android源码学习之四-ActivityGroup是如何对嵌入的Activitys进行管理的.
此前,我们对Activity进行了一些学习,在Android中,还提供了一个ActivityGroup类,该类是Activity的容器,可以包含多个嵌套进来的Activitys,我们接下来依然采用源码分析的方式来了解该类的内部实现。
首先,从SDK中和源码中都可以获知,ActivityGroup类的父类是Activity,也就是说二者具有相同的接口和生命周期,同Activity一样,也有onCreate()、onPause()等函数可供我们重载。
在ActivityGroup的源码中有成员变量
protectedLocalActivityManagermLocalActivityManager;
该变量在ActivityGroup的构造函数中创建并初始化,可见,ActivityGroup的功能实现肯定是要委托给这个对象来完成了。为了给用户开放对此对象的访问,ActivityGroup提供了
publicfinalLocalActivityManagergetLocalActivityManager(){
returnmLocalActivityManager;
}
通过浏览ActivityGroup的源码可以发现,几乎全部是以通过LocalActivityManager对象来完成的具体动作,比如:
protectedvoidonCreate(BundlesavedInstanceState){
super.onCreate(savedInstanceState);
Bundlestates=savedInstanceState!=null
?(Bundle)savedInstanceState.getBundle(STATES_KEY):null;
mLocalActivityManager.dispatchCreate(states);
}
下面,我们就来看一下LocalActivityManager的源码。
在该类中,提供了一个私有类
privatestaticclassLocalActivityRecordextendsBinder{
LocalActivityRecord(String_id,Intent_intent){
id=_id;
intent=_intent;
}
finalStringid;//Uniquenameofthisrecord.
Intentintent;//Whichactivitytorunhere.
ActivityInfoactivityInfo;//Packagemanagerinfoaboutactivity.
Activityactivity;//Currentlyinstantiatedactivity.
Windowwindow;//Activity'stop-levelwindow.
BundleinstanceState;//Lastretrievedfreezestate.
intcurState=RESTORED;//Currentstatetheactivityisin.
}
用于保存Activity的信息,并提供了
privatefinalMap<String,LocalActivityRecord>mActivities
=newHashMap<String,LocalActivityRecord>();
privatefinalArrayList<LocalActivityRecord>mActivityArray
=newArrayList<LocalActivityRecord>();
采用这样的数据结构用于对所有嵌入的子Activity信息进行保存处理。其中前者用于通过String快速查找,后者用于以数组的方式快速访问,是典型的以空间换时间的的方式。
publicvoiddispatchCreate(Bundlestate){
if(state!=null){
finalIterator<String>i=state.keySet().iterator();
while(i.hasNext()){
try{
finalStringid=i.next();
finalBundleastate=state.getBundle(id);
LocalActivityRecordr=mActivities.get(id);
if(r!=null){
r.instanceState=astate;
}else{
r=newLocalActivityRecord(id,null);
r.instanceState=astate;
mActivities.put(id,r);
mActivityArray.add(r);
}
}catch(Exceptione){
……
}
}
}
mCurState=CREATED;
}
从这里我们可以看出,当有一个ActivityGroup被Create的时候,就会有对应的Activity信息被保存到数组中。
当我们调用LocalActivityManager的startActivity()以产生Window的时候,我们也可以看到
publicWindowstartActivity(Stringid,Intentintent){
……
LocalActivityRecordr=mActivities.get(id);
if(r==null){
r=newLocalActivityRecord(id,intent);
adding=true;
}
……
if(adding){
mActivities.put(id,r);
mActivityArray.add(r);
}
……
}
有了这个数组,就可以遍历到ActivityGroup中嵌入的Activitys了,从而可以实现ActivityGroup的功能。
以上的分析结果产生的类图如下: