activity 四种启动方式
- standard标准模式:每次启动一个Activity就会创建一个新的实例
-
singleTop栈顶复用模式:如果新Activity已经位于任务栈的栈顶,就不会重新创建,并回调 onNewIntent(intent) 方法。同个Activity实例在栈中可以有多个,即可能重复创建;该模式的Activity会默认进入启动它所属的任务栈,即不会引起任务栈的变更;为防止快速点击时多次startActivity,可以将目标Activity设置为singleTop
- singleTask栈内复用模式:只要该Activity在一个任务栈中存在,都不会重新创建,并回调 onNewIntent(intent) 方法。如果不存在,系统会先寻找是否存在需要的栈,如果不存在该栈,就创建一个任务栈,并把该Activity放进去;如果存在,就会创建到已经存在的栈中。同个Activity实例在栈中只有一个,即不存在重复创建;可通过android:taskAffinity设定该Activity需要的任务栈,即可能会引起任务栈的变更;常用于主页和登陆页
- singleInstance单实例模式:具有此模式的Activity只能单独位于一个任务栈中,且此任务栈中只有唯一一个实例。当我们这个程序的活动允许其他程序调用时,要实现这个程序和其他程序共享这个活动的话,前边的三种模式都实现不了,因为每个程序都有自己的返回栈,同一个活动在不同的返回栈中入栈的时候会创建一个新的实例。而singleIntance模式可以解决这个问题,以为这个模式有一个独立的返回栈来管理这个活动,无论有多少程序来调用这个活动,都共用同一个返回栈。
Activity 的 Flags
FLAG_ACTIVITY_NEW_TASK
为Activity 指定 singleTask 启动模式,效果和在 XML 中指定 singleTask 模式相同
FLAG_ACTIVITY_SINGLE_TOP
为Activity 指定 singleTop 启动模式,效果和在 XML 中指定 singleTop 模式相同
FLAG_ACTIVITY_CLEAR_TOP
具有此标记位的Activity,当它启动时,在同一个任务栈中所有位于它上面的Activity 都要出栈。这个标记位一般会和 singleTask 启动模式一起出现,在此种情况下,被启动 Activity 实录如果已经存在,系统则会调用它的 onNewIntent。如果被启动的Activity 采用 standard 模式启动,那么它连同它之上的Activity 都要出栈,系统会创建新的Activity 实例并放入栈顶。
FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS
具有此标记位的Activity 不会出现在历史Activity 的列表中,当某些情况下我们不希望用户通过历史列表回到我们的Activity 的时候这个标记比较有用。它等同于在XML 中指定Activity 的属性 android:excludeFromRecents="true"