启动模式
Activity共有四种启动模式,分别是
-
standard
Activity的默认启动模式,每次启动都会新创建这个Activity的实例。
一个任务栈里面可以有多个该Activity的实例。
示例:
操作:连续启动4个standard模式的Activity,之后连续4次点击back键
StandardActivity: onCreate : from -> null
StandardActivity: onCreate : from -> StandardActivity
StandardActivity: onCreate : from -> StandardActivity
StandardActivity: onCreate : from -> StandardActivity
StandardActivity: onDestroy
StandardActivity: onDestroy
StandardActivity: onDestroy
StandardActivity: onDestroy
启动多少次,就有多少个实例被创建。
-
singleTop
栈顶复用模式
当启动该Activity的时候,在任务栈中存在该Activity的实例,并且位于栈顶的时候,并不会重新创建实例,而是复用当前实例,并回调其 onNewIntent(Intent intent)
方法。
-
示例1
操作:先打开一个默认Activity,再连续启动三次singleTop模式的Activity,并点击4次back键
StandardActivity: onCreate : from -> null
SingleTopActivity: onCreate : from -> StandardActivity
SingleTopActivity: onNewIntent : from -> SingleTopActivity
SingleTopActivity: onNewIntent : from -> SingleTopActivity
SingleTopActivity: onDestroy
StandardActivity: onDestroy
可以看到后两次启动singleTop的时候并没有创建新的Activity,而是回调了它的onNewIntent方法。
-
示例2
操作:先启动standard,再启动2次singleTop,再启动一个standard,再启动2次singleTop,然后back退出
StandardActivity: onCreate : from -> null
SingleTopActivity: onCreate : from -> StandardActivity
SingleTopActivity: onNewIntent : from -> SingleTopActivity
StandardActivity: onCreate : from -> SingleTopActivity
SingleTopActivity: onCreate : from -> StandardActivity
SingleTopActivity: onNewIntent : from -> SingleTopActivity
SingleTopActivity: onDestroy
StandardActivity: onDestroy
SingleTopActivity: onDestroy
StandardActivity: onDestroy
可以看到当singleTop不在栈顶的时候,如之后启动的StandardActivity后,再次启动它的时候,又会重新创建实例。
-
singleTask
栈内复用模式
当启动该Activity的时候,如果栈中已经存在该Activity的实例,会复用该实例,回调其 onNewIntent(Intent intent)
方法,并且会清空在该栈中位于这个示例之上的其他Activity实例。
-
示例
操作:先启动standard,再启动2次singleTask,再启动2次standard,然后启动singleTask,最后back退出
StandardActivity: onCreate : from -> null
SingleTaskActivity: onCreate : from -> StandardActivity
SingleTaskActivity: onNewIntent : from -> SingleTaskActivity
StandardActivity: onCreate : from -> SingleTaskActivity
StandardActivity: onCreate : from -> StandardActivity
StandardActivity: onDestroy
SingleTaskActivity: onNewIntent : from -> StandardActivity
StandardActivity: onDestroy
SingleTaskActivity: onDestroy //点击back
StandardActivity: onDestroy //点击back
当singTask的实例不在栈顶的时候,再次启动依然不会创建实例,而是clearTop(销毁其他在之上的Activity),然后再回调onNewIntent
-
singleInstance
单实例模式
当启动该Activity的时候会重新创建一个任务栈,并将该实例存入,这个栈也只会存这个实例。该模式可以看作是一个严格的singleTask模式,所以这种模式除了不会销毁其他Activity外,回调和singleTask一样。
但这种模式还有一个在原理上不奇特,在效果上很奇特的地方,就是当这个Activity的任务栈不在最前时(就是说这个Activity不在当前),当点击back键时,会优先退出完其他Activity的之后再退出该Activity。
- 效果如下
//交替启动standard模式和singleInstance模式的Activity
StandardActivity: onCreate : from -> null
SingleInstanceActivity: onCreate : from -> StandardActivity
StandardActivity: onCreate : from -> SingleInstanceActivity
SingleInstanceActivity: onNewIntent : from -> StandardActivity
StandardActivity: onCreate : from -> SingleInstanceActivity
SingleInstanceActivity: onNewIntent : from -> StandardActivity
StandardActivity: onCreate : from -> SingleInstanceActivity
SingleInstanceActivity: onNewIntent : from -> StandardActivity
StandardActivity: onCreate : from -> SingleInstanceActivity
//下面是点击了back键
StandardActivity: onDestroy
StandardActivity: onDestroy
StandardActivity: onDestroy
StandardActivity: onDestroy
StandardActivity: onDestroy
SingleInstanceActivity: onDestroy
总结来说就是,back键是退出一个栈的栈顶的实例,所以原理并不奇特。栈的退出顺序也是后进先退,就是说当你有两个或两个以上的singleInstance实例启动时,栈的退出也是退完一个栈之后再退你后创建的栈。
网友评论