在 Android 应用程序中,Activity 的启动模式(launch mode)有四种,分别是 standard、singleTop、singleTask 和 singleInstance。其中 singleTask 和 singleInstance 是两种比较特殊的启动模式,它们与 singleTop 和 standard 的区别比较大。
- singleTask
使用 singleTask 启动模式时,系统首先会检查是否存在该 Activity 实例的任务栈,如果存在,则直接将该任务栈调到前台,并清空其上面的所有 Activity;如果不存在,则创建一个新的任务栈,并在其中创建该 Activity 的实例。该模式只允许应用程序中存在一个该 Activity 实例。
使用 singleTask 模式启动的 Activity 只能被添加到一个新的任务中,其他 Activity 不可以与其放在同一个任务中。当该模式下的 Activity 实例已经存在于某个任务栈中时,再次使用该模式启动该 Activity,就不会创建新的实例了,而是直接把该任务栈置顶并回调 onNewIntent() 方法。
- singleInstance
使用 singleInstance 启动模式时,系统会为该 Activity 创建一个新的任务栈,并且该任务栈中只能包含该 Activity 的实例,其他应用程序不能在该任务栈中启动任何 Activity。如果使用该模式启动的 Activity 已经存在于另一个任务栈中,那么该 Activity 就会被移动到该任务栈中,并成为该任务栈的唯一 Activity 实例。
使用 singleInstance 模式启动的 Activity 可以和其他应用程序共享同一个任务栈,但是该任务栈中只能存在一个该 Activity 实例。当该模式下的 Activity 实例已经存在于某个任务栈中时,再次使用该模式启动该 Activity,系统会回调 onNewIntent() 方法,并将该 Activity 移动到前台。
综上所述,singleTask 和 singleInstance 都是比较特殊的 Activity 启动模式,它们可以创建新的任务栈,并且只允许存在一个实例。但是它们之间还有一些区别:
-
使用 singleTask 模式启动的 Activity 允许与其他 Activity 放在同一任务栈中,而使用 singleInstance 模式启动的 Activity 则不允许。
-
当使用 singleTask 模式启动的 Activity 已经存在于某个任务栈中时,再次启动该 Activity 时,系统会清除该 Activity 之上的所有 Activity,并把该任务栈置顶;而使用 singleInstance 模式启动的 Activity 则会移动到当前任务栈并置顶,并调用 onNewIntent() 方法。
因此,在实际开发中,需要根据具体需求选择适合的 Activity 启动模式。如果需要创建一个独立的任务栈,并且只允许存在一个该 Activity 实例,则可以使用 singleTask 或 singleInstance 模式;如果需要与其他 Activity 共享同一个任务栈,并且允许存在多个实例,则可以使用 standard 或 singleTop 模式。