【Android】关于FLAG_ACTIVITY_NEW_TASK 和 taskAffinity

FLAG_ACTIVITY_NEW_TASK有用吗

在Android开发中,我们经常会需要通过Context对象来启动一个Activity。如果Context对象不是Activity,则需要给Intent对象添加flag: FLAG_ACTIVITY_NEW_TASK。 这个是大家都知道的,原因大家也可以直接说出来,Activity对象包含任务栈信息,可以直接在任务栈中启动新的Activity,其他Context对象则不行,不加FLAG_ACTIVITY_NEW_TASK,会直接导致crash。

但是如果只是添加了FLAG_ACTIVITY_NEW_TASK,并不能保证Activity会在新的task中被启动。拉起该Activity的时候,点击返回,你会发现,之前的task也被拉到了前台。这说明,新的Activity也在旧的task中被启动了。

如何保证Activity在新的task中启动

很简单。taskAffinity + FLAG_ACTIVITY_NEW_TASK, 缺一不可。

如何保证Activity不在旧的,或者说默认的task 中被启动呢。这就需要用到 taskAffinity 属性 + FLAG_ACTIVITY_NEW_TASK。taskAffinity属性在清单文件里设置,属性值是关于task的亲和性。不设置改属性,新启动的Activity,就会跟启动它的Activity在同一个task中。

之前做过一个全局对话框,所谓对话框,就是一个dialog主题的Activity。他要求可以在系统在桌面时出现。这个时候,就肯定不能在就任务栈中启动,否则会拉着之前的Activity一起出现。
这里不介绍全局对话框的实现了,重点说明如何调起。
demo的代码:

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        new Handler().postDelayed(new Runnable() {
            @Override
            public void run() {
                Intent intent = new Intent(context, getDialogActivityClass());
                intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                MainActivity.this.startActivity(intent);
            }
        }, 3000);
    }
}

实验很简单,打开MainActivity,迅速返回桌面,3秒后由MainActivity启动全局对话框Activity。
效果如下:

完美。

android:taskAffinity="cn.lankton.globaldialog

如果 tastAffinity没有设置, 或者 启动时没有添加 FLAG_ACTIVITY_NEW_TASK, 都会发生以下情况

作为启动者的MainActivity也被拉到前台了。
这肯定不是我们想看到的。

通过MainActivity.this.getApplicationContext(),启动全局对话框,结果完全与上面一致(除了不加NEW_TASK会crash)。 说明在Context对象非Activity的情况下,即使用了NEW_TASK,在不设置tastAffinity的情况下,新Activity也会被丢进默认task。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值