Activity的启动模式
Activity的启动模式
1.1 Activity的LaunchMode
1.1.1为什么需要启动模式
因为Activity的使用任务栈进行对Activity实例控制,任务栈是一种先进后出的栈结构。如果我们多次启动同一个Activity,系统会重复创建多个实例,这样子就会导致某些场景下,应用的界面跳转不合用户的期望。例如:用户一般希望回到主界面时,再次点击back键后,就是表示真正的退出应用。但是如果是栈形式的每次启动一个Activity就会创建一个实例的一个控制方式,那么就实现不了这个结果。所以,Android设计了启动模式来修改系统的默认行为。
1.1.2启动模式种类
- standard:标准模式。系统默认的模式。每一次启动Activity都会重新创建一个新的实例,不管这个实例是否已经存在。
- singleTop:栈顶复用模式。如果新Activity已经位于任务栈的栈顶,那么此Activity不会被重新创建,同时它的onNewIntent方法会被调用。
- singleTask:栈内复用模式。也会回调其onNewIntent方法。singleTask默认具有clearTop的效果,会导致栈内在该实例前面的所有实例都会被出栈。(生命周期为:onPause->onNewIntent->onResume)
- singleInstance:单实例模式。这种Activity只能单独地位于一个任务栈中。比如:Activity A是singleInstance模式,当A启动后,系统会为它创建一个新的任务栈,然后A独自在这个新的任务栈中,由于栈内复用特性,后续的请求均不会创建新的Activity,除非这个独特的任务栈被系统销毁了。
1.1.3Activity的Flags
- FLAG_ACTIVITY_NEW_TASK
该标记位的作用与singleTask启动模式意义一样。 - FLAG_ACTIVITY_SINGLE_TOP
该标记位的作用与singleTop启动模式意义一样。 - FLAG_ACTIVITY_CLEAR_TOP
具有该标记位的Activity,当它启动时,在同一个任务栈中所有位于它上面的Activity都要出栈。
这个模式一般需要和FLAG_ACTIVITY_NEW_TASK配合使用,在这种情况下,被启动Activity的实例如果存在,那么系统就会调用它的onNewIntent。
如果被启动的Activity采用standard模式启动,那么它连同它之上的Activity都要出栈,系统会创建新的Activity实例并放入栈顶。 - FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS
具有这个标记的Activity不会出现在历史Activity的列表中,当某些情况下,我们不希望用户通过历史列表回到我们的和Activity时,就可以使用该标记。他等同于在XML中指定Activity的属性android:excludeFromRecents="true"