Activity的启动模式

Posted Young_xiaoT

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Activity的启动模式相关的知识,希望对你有一定的参考价值。

Acitivity的四种启动模式:standard、singleTop、singleTask和singleInstance

  • (1)standard:标准模式,默认模式。每次启动一个Activity都会重新创建一个实例,不管这个实例是够已经存在。被创建的实例的生命周期符合典型情况下Activity的生命周期。在这种模式下,谁启动了这个Activity,那么这个Activity就运行在启动它的那个Activity所在的栈中。
  • (2)singleTop:栈顶复用模式。如果Activity已经位于栈顶,那么此Activity就不会被创建,同时它的onNewIntent方法会被调用,通过此方法可以取出当前请求的信息。如果新的Activity的实例已存在但不是位于栈顶,那么新的Activity仍然会重新创建。
  • (3)singleTask:栈内复用模式。这是一种单例模式,只要Activity栈中存在,那么多次启动此Activity都不会重新创建实例,系统会回调onNewIntent方法。singleTask默认有clearTop的效果,会导致栈内所有在其上面的Activity全部出栈。
  • (4)singleInstance:单实例模式。此模式的Activity只能单独地位于一个任务栈中,后续的请求不会再创建新的Activity,除非这个独特的任务栈被系统销毁了。

下面介绍一下任务栈、TaskAffinity参数和allowTaskReparenting属性。

TaskAffinity(任务相关性),这个参数标识了一个Activity所需要的任务栈的名字。默认情况下,所有Activity所需的任务栈的名字为应用的包名,也可以为每个Activity都单独指定TaskAffinity属性。TaskAffinity属性主要和singleTask启动模式或者allowTaskReparenting属性配对使用,在其他情况下没有意义。另外任务栈又分为前台任务栈和后台任务栈,后台任务栈中的Activity位于暂停状态,可以通过切换将后台任务栈再次调到前台。

  • TaskAffinity和singleTask启动模式配对使用时,它是具有该模式的Activity地目前任务栈的名字,待启动的Activity会运行在名字和TaskAffinity相同的任务栈中。

  • TaskAffinity和allowTaskReparenting结合时,当一个应用A启动了应用 B的某个Activity后,如果这个Activity的allowTaskReparenting属性为true,应用B被启动后,此Activity会直接从A的任务栈转移到B的任务栈中。

有两种方式为Activity指定启动模式:

(1)在androidMenifest为Activity指定启动模式:

<activity
    ...      ...

    android:launchMode="singleTask" 

    ...      ...
/>

(2)通过Intent中设置标志位来为Activity指定启动模式:

Intent intent = new Intent();
intent.setClass(MainActivity.this, SecondActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);

区别:

  1. 优先级:第二种方式优先级高于第一种,当两种同时存在时,以第二只用方式为准。
  2. 在限定范围上有所不同。

以上是关于Activity的启动模式的主要内容,如果未能解决你的问题,请参考以下文章

Activity启动模式

activity的四种启动模式

Activity启动模式(launchMode)详解

Activity的四种启动模式

Activity的四种启动模式

Activity的启动模式