Activity的启动模式

启动模式

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实例启动时,栈的退出也是退完一个栈之后再退你后创建的栈。

你可能感兴趣的:(Activity的启动模式)