ActivityGroup对启动新Activity处理的四种情况

        前几天看到hellogv的例子——“ActivityGroup实现Tab分页标签 ”,由于之前没有用过AcitivityGroup,例子代码不算太少,但看上去出现了ActivityGroup的地方就是:平常的主入口(Activity派生类)变成了继承ActivityGroup。所以看了一头雾水……

        其实,ActivityGroup是Activity的派生类(子类),所以具备了Activity的特性(包括平常所用的onCreate到onDestroy的整个生命周期),所以就是当Activity用也没有问题。不过,它的主要扩展功能是能够同时管理多个Activity。所以如果在某个界面(Activity)上需要来回切换多个不同或相同的Activity时,它是很好用的。

        曹文斌的“ActivityGroup是如何对嵌入的Activitys进行管理的 ”文章已经详细解释ActivityGroup与其管理的子Activity的关系,概括来说是:ActivityGroup委托LocalActivityManager对多个子Activity进行管理(子Activity都放到一个Map中,同时为了提高效率也放到一个数组ArrayList中),其中每个子Activity都对应唯一的标识,这个标识用作Map的key值。ActivityGroup使用下面的方式启动子Activity:

        其中, getLocalActivityManager()是ActivityGroup的方法,所以直接实例化一个ActivityGroup来调用这个方法也是可以的。通过该方法得到管理子Activity的委托LocalActivityManager实例,该实例使用startActivity(String id, Intent intent)方法启动子Activity。

 

        既然ActivityGroup管理着多个子Activity,如果原来没有子Activity运行,那不用说就是启动一个新的Activity来运行了;但如果当前已经有一个子Activity正在运行,此时再调用startActivity(String id, Intent intent),会发生些什么情况呢?情况分4种:

  1. 如果参数中的intent匹配到一个新的(即在Map中不存在的)Activity时,那就启动一个新的Activity,并把id作为key、新的Activity作为value放到Map中;新的Activity一般是指与Map中已经存在的Activity派生类不同的其它Activity的派生类。如果匹配到子Activity与当前运行的相同,则再分情况;
  2. 如果当前运行的子Activity不是以multiple模式启动或者设置了FLAG_ACTIVITY_SINGLE_TOP属性时,当前运行的子Activity继续运行(而不是结束掉),并调用Activity#onNewIntent(Intent)方法,这个会体现在onResume()中(即之后调用onResume);生命周期为:onCreate -> onStart -> onResume -> onPause -> onNewIntent -> onResume -> onPause -> onNewIntent -> ......
  3. 如果新请求中的Intent与当前运行的子Activity的Intent内容一样(extras除外),且新请求中的Intent没有设置FLAG_ACTIVITY_CLEAR_TOP属性,则当前运行的子activity会继续运行(跟当前一样),也不会调用onNewIntent、onResume;
  4. 其它情况(如设置了FLAG_ACTIVITY_CLEAR_TOP属性),则先把当前的子Activity结束掉,然后启动新的Activity(这新旧两个子Activity类名同一个)。

        hellogv的例子中,子Activity只有一种SubActivity,如果Intent设置了FLAG_ACTIVITY_CLEAR_TOP属性,则每次切换时都会先把当前的SubActivity结束掉,然后再启动一个新的SubActivity;如果没有设置FLAG_ACTIVITY_CLEAR_TOP属性,则当前的SubActivity继续运行,此时如果Activity是非multiple模式或Intent设置了FLAG_ACTIVITY_SINGLE_TOP属性则可以看到生命周期的变化,否则就好像什么都没有发生。

没有更多推荐了,返回首页