古人學問無遺力,少壯工夫老始成。紙上得來終覺淺,絕知此事要躬行。南宋.陸遊《冬夜讀書示子聿(yù)》
在android.content.Intent中定义了若干个flags,其中最重要的有以下几个:
我们要演示几个步骤:1.在appB中的FirstActivity点击按钮跳转到appA中的SecondActivity;2.按Home键回到主屏,在主选单中再次启动appB;3.按Home键回到主屏,在主选单中启动appA。演示过程如图所示:
我们发现在从appB跳转到appA的SecondActivity之后,SecondActivity实例好像是嵌入到了appB中,但是不影响appA的正常运行,这种关系如下图所示:
首先,Activity启动模式都按照默认值“standard”。从FirstActivity跳转到SecondActivity,SecondActivity实例如下:
从ThirdActivity跳转到SecondActivity时,跳转代码如下:
从序列号可以看到这两个实例是不同的,证明它是经过了销毁和重新的过程。
然后我们把ThirdActivity中的跳转代码添加FLAG_ACTIVITY_SINGLE_TOP标记:
如果我们不想添加FLAG_ACTIVITY_SINGLE_TOP,那么把SecondActivity的启动模式改为“standard”之外的三种即可,效果和上面一样,都不会创建新的实例。
3.FLAG_ACTIVITY_SINGLE_TOP:当task中存在目标Activity实例并且位于栈的顶端时,不再创建一个新的,直接利用这个实例。我们在上边的例子中也有讲到。
在<activity>中定义了几个常见的task相关属性,它们分别代表了task内部不同的行为特征,我们就来逐个介绍一下:
1.android:allowTaskReparenting
首先,在appB的FirstActivity中,我们将跳转动作做以下改动:
然后我们按Home键,是当前应用退居后台,我们回到主选单,重新启动appB,界面如下:
此时我们在主选单中启动Browser应用,出现在我们眼前的界面是这样的:
以上这种行为也证明了我们前面的论断,为了更清楚的说明问题,也为了让大家自己可以验证,下面我们要再次演示一下appB和appA的启动过程:
对于appA,在上面的基础上,不用修改其他地方,只需为SecondActivity的<activity>元素添加一个属性,如下:
然后,在appB中的FirstActivity跳转代码改为:
我们启动appB,看到一下界面:
然后点击按钮,跳转到appA中的SecondActivity,界面如下:
然后我们启动appA,这是我们不会看到它的FirstActivity,而是看到了它的SecondActivity:
需要注意的是,如果appB退居后台之后,没有再次启动appB,而是直接启动appA,将不会出现以上现象。重新宿主的动作发生在appB再次启动的过程中。
android:allowReparenting的效果图如下:
2.android:alwaysRetainTaskState
这个属性对于一些应用非常有用,例如Browser应用程序,有很多状态,比如打开很多的tab,用户不想丢失这些状态,使用这个属性就极为恰当。
无图无真相,我们就来以实例演示一下这个过程,我们首先修改appB的根Activity的<activity>元素,如下:
然后我们让FirstActivity跳转到SecondActivity,结果如下:
然后我们按Home键回到主界面,再次启动appB,我们看到以下结果:
我们看到,再次启动appB时,我们只能看到FirstActivity界面,此时在FirstActivity之上的所有Activity都已经被清除出栈。示意图如下:
以上就是今天总结的内容,这些都是常用的知识,除此之外还有很多等着我们去探索,继续努力。
来源:http://blog.csdn.net/liuhe688/article/details/6761337