`
xym_love
  • 浏览: 114974 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类
最新评论

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:

 

  1. Intent intent = new Intent(MyActivityGroup.this, SubActivity.class);  
  2. getLocalActivityManager().startActivity("SubActivityKey", intent);  

 

        其中, 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属性则可以看到生命周期的变化,否则就好像什么都没有发生。

分享到:
评论

相关推荐

    使用ActivityGroup管理Activity

    `localActivityManager`允许开发者在`ActivityGroup`内启动新的Activity,同时确保它们的生命周期得到正确管理。 2. `startChildActivity()`:这个方法用于在`ActivityGroup`中启动一个新的子Activity。它接收两个...

    用ActivityGroup解决TabHost中多个Activity跳转问题

    总结来说,ActivityGroup曾是解决TabHost中多个Activity跳转问题的一种方法,但已被废弃。现在,我们应该使用Fragment和FragmentTransaction来构建多层级的界面,同时利用Android提供的生命周期管理机制,以实现更...

    使用ActivityGroup来切换Activity和Layout

    `ActivityGroup`是`TabActivity`的一种替代方案,它允许我们在一个父`Activity`中嵌套多个子`Activity`,并在需要时动态替换内容。 首先,我们需要了解`ActivityGroup`的核心概念。`ActivityGroup`是`Sherlock`库中...

    ActivityGroup之Activity内跳转和外跳转

    此外,ActivityGroup还需要处理配置更改(如屏幕方向改变)的情况,以避免丢失子Activity的状态。这可能需要重写`onSaveInstanceState()`和`onRestoreInstanceState()`方法,保存和恢复子Activity的相关数据。 尽管...

    ActivityGroup之activity内跳转和外跳转

    在这种情况下,通常使用标准的`startActivity()`方法,但需要注意的是,由于子Activity是在ActivityGroup内部,所以需要额外的处理来确保跳转的顺利进行,例如正确处理返回栈的行为,以免用户在返回时陷入混乱。...

    Android开发—使用ActivityGroup来切换Activity和Layout.pdf

    在Android开发中,ActivityGroup是一种特殊类型的Activity,它允许开发者在一个Activity内嵌套其他Activity,实现类似TabHost或Fragment的效果,但这是在Android早期版本(API级别较低)中的一种实现方式。...

    ActivityGroup实现Activit栈

    在Android开发中,ActivityGroup是早些版本API中提供的一种特殊类型的Activity,它允许开发者在一个TabHost或者帧布局(FrameLayout)中嵌套多个Activity,从而实现类似iOS中UINavigationController的堆叠管理器效果...

    ActivityGroup应用实例

    当在ActivityGroup中启动一个新的Activity时,它不会像普通情况那样替换当前Activity,而是会在当前Activity中创建一个新的窗口来显示子Activity的内容。这种方式可以实现在一个Activity中展示多个视图,比如在一个...

    android ActivityGroup的demo

    通过LocalActivityManager,我们可以方便地在ActivityGroup内启动新的子Activity,并在需要时切换到其他子Activity。 2. **onCreateView()** 和 **onDestroyView()**:在ActivityGroup的子Activity中,我们需要重写...

    Android Gallery+ActivityGroup实现滑动TAB独立Activity

    总结起来,"Android Gallery+ActivityGroup实现滑动TAB独立Activity"是一种早期的Android开发技术,虽然现在已经被更先进的Fragment所取代,但理解这一模式对于理解Android应用的演化历程以及如何处理旧代码库中的...

    ActivityGroup框架

    在这样的情况下,可能需要手动处理启动系统Activity的返回结果,确保在正确的Activity上下文中进行操作。 添加竖排选项卡可能是通过自定义View或者使用第三方库,如SlidingTabLayout、HorizontalScrollView等实现的...

    tabhost和ActivityGroup的组合使用

    4. 设置内容:每个TabSpec需要关联一个Intent,这个Intent可以启动一个新的Activity或Fragment,以展示标签页的内容。 接下来,我们谈谈ActivityGroup。在早期的Android版本中,ActivityGroup用于在一个Tab内管理多...

    gridview+activityGroup实现tab分页

    接下来,`ActivityGroup`是Android早期版本(API 13以下)中用于实现嵌套Activity的一种方式,它允许在一个Activity内包含其他Activity。在TabHost中,我们可以使用ActivityGroup来实现每个Tab下的不同页面。然而,...

    ActivityGroup应用-如何把一个Activity加载成一个视图

    在Android开发中,ActivityGroup是一种老式的容器组件,它允许开发者在一个Activity中嵌套其他Activity作为子视图。...如果需要处理遗留代码或对ActivityGroup有深入了解的需求,以上内容将为你提供基础的指导。

    ActivityGroup

    在Android应用开发中,`ActivityGroup`是早期版本(Android 2.3 Gingerbread之前)中用于实现嵌套Activity的一种机制。它属于`ViewGroup`的子类,允许开发者在一个Activity内部显示其他Activity,从而创建出类似多...

    ActivityGroupDemo

    它提供了startActivity、windowFocusChanged等方法,允许我们在ActivityGroup内启动新的Activity并处理焦点变化。 2. 子Activity的生命周期:当在ActivityGroup中启动一个新的Activity时,它的生命周期回调(如...

    ActivityGroup Demo

    `ActivityGroup`是`TabActivity`的一个子类,它允许开发者在单一的Tab或窗口内嵌套多个Activity,提供了一种在不创建新窗口的情况下展示多个界面的方式。这个"ActivityGroup Demo"是为了帮助开发者理解和学习如何...

    统一管理Activity,每个Activity又相对独立

    自定义的ActivityGroup类中,需要重写一些关键方法,如`onStartChildActivity()`用于启动子Activity,`onResumeChildActivity()`和`onPauseChildActivity()`用于处理子Activity的生命周期回调。此外,还可以实现一...

    ActivityGroup demo

    ActivityGroup是在Android早期版本中,为了在TabHost或者TabActivity中实现嵌套Activity而设计的一种特殊类型的Activity。它允许在一个Activity内部启动其他Activity,形成一个嵌套的Activity结构。然而,随着...

Global site tag (gtag.js) - Google Analytics