Intent中的Flag
<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />
Activity的加载模式受启动Activity的Intent对象中设置的Flag和manifest文件中Activity的<activity>元素的特性值交互控制。
Intent intent = new Intent(ReorderFour.this, ReorderTwo.class);
intent.addFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT);
startActivity(intent);
Intent的常用Flag参数:
1
FLAG_ACTIVITY_CLEAR_TOP:例如现在的栈情况为:A B C D 。D此时通过intent跳转到B,如果这个intent添加FLAG_ACTIVITY_CLEAR_TOP 标记,则栈情况变为:A B。如果没有添加这个标记,则栈情况将会变成:A B C D B。也就是说,如果添加了FLAG_ACTIVITY_CLEAR_TOP 标记,并且目标Activity在栈中已经存在,则将会把位于该目标activity之上的activity从栈中弹出销毁。这跟上面把B的Launch mode设置成singleTask类似。
2
FLAG_ACTIVITY_NO_HISTORY:例如现在栈情况为:A B C。C通过intent跳转到D,这个intent添加FLAG_ACTIVITY_NO_HISTORY标志,则此时界面显示D的内容,如果此时D中又跳转到E,栈的情况变为:A B C E,此时按返回键会回到C,因为D根本就没有被压入栈中。
3
FLAG_ACTIVITY_SINGLE_TOP:和上面Activity的 Launch mode的singleTop类似。如果某个intent添加了这个标志,并且这个intent的目标activity就是栈顶的activity,那么 将不会新建一个实例压入栈中。
4
FLAG_ACTIVITY_NEW_TASK:例如现在栈1的情况是:A B C。C通过intent跳转到D,并且这个intent添加了FLAG_ACTIVITY_NEW_TASK 标 记,如果D这个Activity在Manifest.xml中的声明中添加了Task affinity,并且和栈1的affinity不同,系统首先会查找有没有和D的Task affinity相同的task栈存在,如果有存在,将D压入那个栈,如果不存在则会新建一个D的affinity的栈将其压入。如果D的Task affinity默认没有设置,或者和栈1的affinity相同,则会把其压入栈1,变成:A B C D,这样就和不加FLAG_ACTIVITY_NEW_TASK 标记效果是一样的了。 注意如果试图从非activity的非正常途径启动一个activity,比如从一个service中启动一个activity,则intent
必须
要添加FLAG_ACTIVITY_NEW_TASK 标记。
Activity的归属,也就是Activity应该在哪个Task中,Activity与Task的吸附关系。我们知道,一般情况下在同一个应用中,启动的Activity都在同一个Task中,它们在该Task中度过自己的生命周期,
那么为什么我们创建的Activity会进入这个Task中?它们会转到其它的Task中吗?如果转到其它的Task中,它们会到什么样的Task中去?
解决这些问题的关键,在于每个Activity的taskAffinity属性。
每个Activity都有taskAffinity属性,这个属性指出了它希望进入的Task。如果一个Activity没有显式的指明该Activity的taskAffinity,那么它的这个属性就等于Application指明的taskAffinity,如果Application也没有指明,那么该taskAffinity的值就等于包名。而Task也有自己的affinity属性,它的值等于它的根Activity的taskAffinity的值。
一开始,创建的Activity都会在创建它的Task中,并且大部分都在这里度过了它的整个生命。然而有一些情况,创建的Activity会被分配其它的Task中去,有的甚至,本来在一个Task中,之后出现了转移。
加载某个Activity的intent,Flag被设置成FLAG_ACTIVITY_NEW_TASK时,它会首先检查是否存在与自己taskAffinity相同的Task,如果存在,那么它会直接宿主到该Task中,如果不存在则重新创建Task。
例一:当一个应用程序加载一个singleTask模式的Activity时,首先该Activity会检查是否存在与它的taskAffinity相同的Task。
1、如果存在,那么检查是否实例化,如果已经实例化,那么销毁在该Activity以上的Activity并调用onNewIntent。如果没有实例化,那么该Activity实例化并入栈。
2、如果不存在,那么就重新创建Task,并入栈。
例二:当一个应用程序加载一个singleInstance模式的Activity时,如果该Activity没有被实例化,那么就重新创建一个Task,并入栈,如果已经被实例化,那么就调用该Activity的onNewIntent;
2、singleInstance的Activity所在的Task不允许存在其他Activity,任何从该Activity加载的其它Actiivty(假设为Activity2)都会被放入其它的Task中,如果存在与Activity2相同affinity的Task,则在该Task内创建Activity2。如果不存在,则重新生成新的Task并入栈。
onNewIntent的调用
a、该activity设置如下属性 android:launchMode="singleTop"。
b、该activity已经处在栈的顶端,通过其他的方法又重新启动该acitvity时被调用,如搜索,这时oncreate()方法不调用。
b、该activity已经处在栈的顶端,通过其他的方法又重新启动该acitvity时被调用,如搜索,这时oncreate()方法不调用。
Intent对象在Android开发中起着举足轻重的作用,其内置了丰富的常量,用于传递数据,下面本文将介绍跟Task有关的一些Flag参数,
1、
FLAG_ACTIVITY_BROUGHT_TO_FRONT: 这个标志一般不是由程序代码设置的,如在launchMode中设置singleTask模式时系统帮你设定。
2.、
FLAG_ACTIVITY_CLEAR_TOP: 如果目标Activity已经运行于当前的Task中,则关闭Activity Stack中在此Activity上方的所有Activity,然后将此Intent传递到该Activity实例内。例如,假设一个Task的Activity Stack中包含这些Activity:A,B,C,D。如果D调用了startActivity(),并且Intent指向B,那么,C和D都将结束,然后B接收到这个Intent,因此,目前stack的状况是:A,B。
3、
FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET: 如果设置,这将在Task的Activity Stack中设置一个还原点,当Task恢复时,需要清理Activity。例如下一次Task带着FLAG_ACTIVITY_RESET_TASK_IF_NEEDED标记进入前台时,这个Activity和它之上的都将关闭,以至于用户不能再返回到它们,但是可以回到之前的Activity。
4、
FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS: 如果设置,新的Activity不会在最近启动的Activity的列表中保存。
5、
FLAG_ACTIVITY_FORWARD_RESULT: 如果设置,并且这个Intent用于从一个存在的Activity启动一个新的Activity,那么,这个作为答复目标的Activity将会传到这个新的Activity中。这种方式下,新的Activity可以调用setResult(int),并且这个结果值将发送给那个作为答复目标的Activity。
6、
FLAG_ACTIVITY_LAUNCHED_FROM_HISTORY: 这个标志一般不由应用程序代码设置,如果这个Activity是从历史记录里启动的(常按HOME键),那么,系统会帮你设定。
7、
FLAG_ACTIVITY_MULTIPLE_TASK: 不建议使用此标志,除非你自己实现了应用程序启动器。
8、
FLAG_ACTIVITY_NO_ANIMATION: 这个标志将阻止系统进入下一个Activity时应用Acitivity迁移动画。
9、
FLAG_ACTIVITY_NO_USER_ACTION: 这个标志将在Activity暂停之前阻止从最前方的Activity回调的onUserLeaveHint()。
FLAG_ACTIVITY_PREVIOUS_IS_TOP: If set and this intent is being used to launch a new activity from an existing one, the current activity will not be counted as the top activity for deciding whether the new intent should be delivered to the top instead of starting a new one. The previous activity will be used as the top, with the assumption being that the current activity will finish itself immediately.
10、
FLAG_ACTIVITY_REORDER_TO_FRONT: 这个标志将引发已经运行的Activity移动到历史stack的顶端。
11、
FLAG_ACTIVITY_RESET_TASK_IF_NEEDED: If set, and this activity is either being started in a new task or bringing to the top an existing task, then it will be launched as the front door of the task. This will result in the application of any affinities needed to have that task in the proper state (either moving activities to or from it), or simply resetting that task to its initial state if needed.
12、Intent.FLAG_ACTIVITY_REORDER_TO_FRONT 标志,这个标志表示:如果这个activity已经启动了,就不产生新的activity,而只是把这个activity实例加到栈顶来就可以了。
上面纷杂的Intent内置参数在简单的Android应用时,可以启到比较好的控制作用,但是一旦Android应用过于复杂,那么自定一个Activity List以管理Activity不失于一种更好更高效的管理方法。
转载于:https://blog.51cto.com/haiyuanxi/963537