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的主要内容,如果未能解决你的问题,请参考以下文章