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的功能。

以上的分析结果产生的类图如下:

相关推荐