一直没有仔细的研究过Intent的Flag,因为感觉没有什么问题,最近项目上发现页面乱跳,设置的比较混乱,决定好好整理整理!
在介绍四个模式之前介绍一个东西:taskAffinity
这个平常都没有怎么注意到,直到这次才发现一个这么重要的东西被我忽略掉了!这个属性在application节点与activity节点上都有,如果不设置的话使用默认的包名;它的作用就是用来区分栈Task的,即如果Activity设置了taskAffinity为Task1,当activity在启动的时候会先去找名为Task1的栈,如果有则进入并创建activity实例,没有则新建栈再创建activity实例;
那现在来看启动模式
1、FLAG_ACTIVITY_NEW_TASK:
引用“Android总结”的描述:当Intent对象包含这个标记时,系统会寻找或创建一个新的task来放置目标Activity,寻找时依据目标Activity的taskAffinity属性进行匹配,如果找到一个task的taskAffinity与之相同,就将目标Activity压入此task中,如果查找无果,则创建一个新的task,并将该task的taskAffinity设置为目标Activity的taskActivity,将目标Activity放置于此task。注意,如果同一个应用中Activity的taskAffinity都使用默认值或都设置相同值时,应用内的Activity之间的跳转使用这个标记是没有意义的,因为当前应用task就是目标Activity最好的宿主。
两个Activity的代码如下:
<activity
android:name=".FirstActivity"
android:taskAffinity=".FirstActivity"/>
<activity
android:name=".SecondActivity"
android:taskAffinity=".SecondActivity"/>
FirstActivity跳转到SecondActivity的代码如下:
private void toFSecond() {
Intent intent = new Intent(FirstActivity.this, SecondActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);
}
得到的结果如下:
可以发现两个页面确实不在一个栈里;
但是如果把android:taskAffinity的属性去掉之后,多次反复调用;
SecondActivity调到FirstActivity的代码是:
Intent intent = new Intent(this, FirstActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);
可以看到如下效果:
会发现同一个栈中存在多个FirstActivity和SecondActivity实例,这应该不是我们想要的,只要一个就可以了!
使用小结:当你仅仅想为你对将要启动的Activity开启新的Task时,请千万记住不要设置相同的taskAffinity属性;否则该标记是没有任何效果的;
2、FLAG_ACTIVITY_CLEAR_TOP
字面意思清除顶部的,它想实现的效果是清除它以上的所有activity实例;
3、FLAG_ACTIVITY_REORDER_TO_FRONT
Intent.FLAG_ACTIVITY_REORDER_TO_FRONT这个标志表示:如果这个activity已经启动了,就不产生新的activity,而只是把这个activity实例加到栈顶来就可以了。
这样就能够保证在堆栈中只有一个Activity实例;