Android Activity 启动模式:Intent 的Flag

xiaoxiao2021-02-27  175

一直没有仔细的研究过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实例;

转载请注明原文地址: https://www.6miu.com/read-12356.html

最新回复(0)