Android启动模式小结

来源:互联网 发布:linux 文件用户组 编辑:程序博客网 时间:2024/06/04 00:25

一、概述

1、分类

Android的启动模式分为以下四种:

  • standard
  • singleTop
  • singleTask
  • singleInstance

其中“standard”为activity的默认启动模式。

2、使用

直接在AndroidManifest.xml中的对应的activity中添加“android:launchmode”字段即可。如下:

<activity    android:name=".BActivity"    android:launchMode="standard"/>

3、作用

launchMode决定了是否生成新的Activity实例,是否重用已存在的Activity实例,是否和其他的Activity实例放在同一个task任务栈里。

二、四种启动模式的定义

1、Android中的task任务栈

task任务栈是一个具有栈(决定了其先进后出的特性)结构的容器,可以用来放置多个activity的实例。当我们启动一个应用的时候,系统就会为之创建一个task,来存放根Activity。

举个例子,AActivity(根Activity),BActivity,CActivity其启动模式都为standard。此时进入应用,启动AActivity,然后在AActivity中启动BActivity,最后在BActivity中启动CActivity。整个流程精简成:A->B->C。task任务栈变化如下图:




其中栈内Activity分布使用“(ABC)”表示task任务栈中从栈底到栈顶的activity实例的排列分布。

2、启动模式—standard

这是Activity的默认启动模式。新建的activity实例直接放入task任务栈,无论该activity实例是否在栈中。

举个栗子: A,B,C,D都是standard模式。
(1)、如果Activity的操作顺序:A->B->C->D,则task任务栈内的分布为:(ABCD),如图2.1。
(2)、如果Activity的操作顺序:A->A->A,则task任务栈内的分布为:(AAA),如图2.2。注:A->A时,新的A会从onCreate执行。



3、启动模式—singleTop

如果该Activity实例已经在task任务栈栈顶了,那么就会重用这个栈顶的Activity实例(此时调用onNewIntent()方法),不会再重新去实例化Activity对象

举例: A,B,C,D都是singleTop模式。
(1)、如果Activity的操作顺序:A->B->C->D,则task任务栈内的分布为:(ABCD),如图3.1。
(2)、如果Activity的操作顺序:A->B->A->C,则task任务栈内的分布为:(ABAC),如图3.2。注:A->B->A时,此时A仍旧从onCreate开始。
(3)、如果Activity的操作顺序:A->B->A->A,则task任务栈内的分布为:(ABA),如图3.3。注:A->B->A时,此时A从onNewIntent开始,A->B->A->A时,此时A从onNewIntent开始



4、启动模式—singleTask

如果该Activity实例已经存在task任务栈中,那么就会重用该Activity的实例(此时调用onNewIntent()方法),并清除该activity实例到栈顶之间的所有activity实例。因此该activity在task容器栈中永远只有唯一实例对象,不会存在两个相同的实例对象。

举例: A,B,C,D都是singleTask模式。
(1)、如果Activity的操作顺序:A->B->C->D,则task任务栈内的分布为:(ABCD),如图4.1。
(2)、如果Activity的操作顺序:A->B->A->C,则task任务栈内的分布为:(AC),如图4.2。注:A->B->A时,此时A仍旧从onNewIntent开始。
(3)、如果Activity的操作顺序:A->B->A->A,则task任务栈内的分布为:(A)。



5、启动模式—singleInstance

这种launchMode会启用一个新的task任务栈,并保证不再有其他的Activity实例进入。一旦该模式的Activity的实例存在于某个栈中,任何应用再激活改Activity时都会重用该栈中的实例,其效果相当于多个应用程序共享一个该Activity,不管谁激活该Activity都会进入同一个栈中。

举例: A,C,D都是standard模式,B是singleInstance模式
(1)、如果Activity的操作顺序:A->B->C->D,则task任务栈内的分布如图5.1。
A->B:因为B是singleInstance启动模式,所以此时会新建一个task任务栈来存放B的实例
A->B->C:因为C是standard模式,此时C的实例push到A所在的任务栈
A->B->C->D:因为D是standard模式,此时D的实例push到A所在的任务栈。此时,在D界面按返回键退出到C,再按返回键退出到A,再按返回键退出到B,再按返回键退出应用。
(2)、如果Activity的操作顺序:A->B->C->B,则task任务栈内的分布如图5.2。
A->B->C->B:因为B是singleInstance模式,并且B的实例已经存在,直接重用已存在的B的实例(调用onNewIntent())。此时在B界面按返回键退出到C,再按返回键退出到A,再按返回键退出应用。



6、四种启动模式的主要区别

launchMode standard singleTop singleTask singleInstance 是否需要新建task任务栈 否 否 否 是 是否允许task任务栈中存在多个该Activity的实例 是 是 否 - 是否允许多个相同Activity的实例叠加 是 否 否 -

注:singleInstance模式的Activity的实例在所有task任务栈中有且之存在一个实例。

原创粉丝点击