Android启动模式小结

本文介绍了Android的四种启动模式:standard、singleTop、singleTask和singleInstance。详细解析了每种模式下Activity的创建、重用及任务栈行为,强调了它们在task任务栈中的区别,帮助理解如何设置和运用这些启动模式。
摘要由CSDN通过智能技术生成

一、概述

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、四种启动模式的主要区别

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

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值