Android中Activity的启动模式

发布时间 2023-06-12 09:44:26作者: Devil'soul

Android中Activity的启动模式一共有4种,分别是standard、singleTop、singleTask、singleInstance,可以在AndroidManifest.xml中通过给<activity>标签指定 android:launchMode属性来指定启动模式。

1、standard

在standard模式下,每当启动一个新的Activity,他就会在返回栈中入栈,并处于栈顶的位置,对于使用standard模式的Activity,系统不会在乎这个Activity是否已经在返回栈中存在,每次启动都会创建一个该Activity的新实例。

2、singleTop

可能在有些情况下,你会觉得standard模式不太合理。Activity明明已经在栈顶了,为什么再次启动的时候还要创建一个新的Activity实例呢?这时可以使用singleTop启动模式,在该模式下,启动Activity时如果发现返回栈的栈顶已经是该Activity,则认为可以直接使用它,不会再创建新的Activity实例。

3、singleTask实例

使用singleTop启动模式可以很好的解决重复创建栈顶Activity的问题。但是如果该Activity没有处于栈顶的位置,还是会创建多个Activity实例。如果要解决这个问题就需要结组singleTask模式来实现了。当指定Activity的启动模式为singleTask时,每次启动Activity时,系统首先会在返回栈中检查是否存在该Activity实例,如果发现已经存在则直接使用该实例,并把在这个Activity之上的所有其他Activity统统出栈,使自己处于栈顶位置,如果没有发现则会创建一个新的Activity实例。

4、singleInstance

 指定为singleInstance模式的Activity会启用一个新的返回栈来管理这个Activity(其实如果singleTask模式指定了不同的taskAffinity,也会启动一个新的返回栈)。那么这个做有什么意义呢?想象以下场景,假设我们的程序中有一个Activity是允许其他程序调用的,如果想实现其他程序和我们的程序可以共享这个Activity实例,应该如何实现呢?使用前面三种模式肯定实现不了的,因为每个应用程序都会有自己的返回栈,同一个Activity在不同的返回栈中入栈时必然创建了新的实例。而使用singleInstance模式就可以解决这个问题,在这种模式下,会有一个单独的返回栈来管理这个Activity,不管是哪个应用程序来访问这个Activity,否会用同一个返回栈,也就解决了共享Activity实例的问题。

tip:Activity中可以打印出当前返回栈的ID

Log.d("SecondActivity", "$this  Task id is $taskId")