Android Activity 启动模式:Intent 的Flag

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值