Android关于FLAG_ACTIVITY_NEW_TASK 和 taskAffinity

Posted lankton

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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。

以上是关于Android关于FLAG_ACTIVITY_NEW_TASK 和 taskAffinity的主要内容,如果未能解决你的问题,请参考以下文章

关于Android的Build类——获取Android手机设备各种信息

20200628-关于Android

关于“使用 Android 播放任意音调”

Android课程---关于对话框的学习

Android 关于软键盘

android开发中 关于radiogroup