Activity的四种启动模式,浅析

Activity的四种启动模式,浅析

​ 概念:activity栈(Task),Android的Task是一个有点麻烦的概念,Android并没有提供可以调用Task的API,因此开发者无法直接访问到Task,只能调用activity的getTaskId()来获取它所在的Task的ID。事实上可以将Task理解成Activity栈,Task以栈的形式来管理activity:先启动的activity被放在栈底,后创建的activity被放在栈顶。

1.Standard

标准模式,是默认的加载模式。

通过Standard模式创建的activity,Android会为它创建一个新的实例,并将该实例放到当前Task栈中,(并不会生成新的Task栈)。

以下是相关操作:

​ 开启activity :LaunchmodelAC -> 再次点击按键,开启LaunchmodelAC -> 再次点击按键,开启LaunchmodelAC -> 点击返回键 -> 点击返回键

​ 下面是各个LaunchmodelAC实例(activity)的生命周期,TaskID.

可以看出:

​ 在采用Standard模式时,

​ 1.不会重新生成一个Task栈。

​ 2.可以创建同一个activity的多个实例,并且多个activity的生命周期按照正常的执行。

​ 3.新创建的activity的实例被放入到Task栈的栈顶。

​ 4.当旧activity仍然在task栈内,但不在栈顶时(不在前台了),会依次执行旧activity的onPause() =>【新activity的onCreate(),onStart(),onResume() (新activity在前台了) 】=> 旧activityonStop(),但不会执行旧activity的onDestroy();

​ 5.当activity不再位于前台,并且当前正处于Task栈顶,那么才会onPause(),onStop(),onDestroy()
在这里插入图片描述

2.SingleTop

​ SingleTop模式和Standard模式基本相似,但有一点不同:当将要启动的目标activity已经位于Task栈顶时,系统不会重新创建目标activity的实例,而是直接复用已有的activity实例。

点击按钮创建两次launchmodelAC的实例,结果如下图。

可以看到:

​ 1.只创建了该activity的唯一一个实例,没有重新创建新的Task栈

​ 2.activity的生命周期和Standard一致。

这个过程中Task栈的情况:从左到右==>栈底到栈顶

Task::MainAC --> LaunchmodelAC //从主菜单界面进入到LaunchmodelAC

Task::MainAC --> LaunchmodelAC //从LaunchmodelAC 进入到LaunchmodelAC,在栈顶所以不会重新创建实例

在这里插入图片描述

​ 3.当该activity不位于Task栈的栈顶时(有其他的activity位于栈顶),和Standard模式一样,会再次为该activity创建一个新的实例放入栈顶。之前的实例仍然存在栈内原始位置。

这个过程中Task栈的情况:从左到右==>栈底到栈顶


Task::MainAC --> LaunchmodelAC //从主菜单界面进入到LaunchmodelAC


Task::MainAC --> LaunchmodelAC --> LaunchmodelAC2 //从 LaunchmodelAC进入到LaunchmodelAC2


Task::MainAC --> LaunchmodelAC --> LaunchmodelAC2 -> LaunchmodelAC //从 LaunchmodelAC2进入到LaunchmodelAC


Task::MainAC --> LaunchmodelAC --> LaunchmodelAC2 //从 LaunchmodelAC点击返回键


Task::MainAC --> LaunchmodelAC //从 LaunchmodelAC2点击返回键


在这里插入图片描述

3.SingleTask

​ 采用SingleTask模式时,activity能够保证在同一个Task中只有一个实例,当系统采用SingleTask模式启动activity时,有如下三种情况:

​ 1.如果将要启动的activity不存在,系统将会创建目标activity的实例,并将它放入Task栈顶;

​ 2.如果将要启动的activity已经存在Task栈的栈顶,那么按照SingleTop模式行为一样,不会再重新创建该activity的实例;

​ 3.如果将要启动的activity已经存在,但没有位于Task栈的栈顶,系统将会将位于该activity上面的所有activity移出Task栈,从而使目标activity转入栈顶。

在这里插入图片描述

可以看出:

​ 1.打开LaunchmodelAC后,再开启LaunchmodelAC2,再从中打开LaunchmodelAC,此时点击返回键,直接就回到了主菜单界面了

这个过程中Task栈的情况:从左到右==>栈底到栈顶


​ Task::MainAC --> LaunchmodelAC //从主菜单界面进入到LaunchmodelAC


​ Task:: MainAC -->LaunchmodelAC --> LaunchmodelAC2 //从LaunchmodelAC 进入到LaunchmodelAC2


​ Task:: MainAC -->LaunchmodelAC //从LaunchmodelAC2进入到LaunchmodelAC


4.SingleInstance

​ 在这个模式中,系统保证无论从哪个Task中启动目标activity,只会创建一个目标activity实例,并会使用一个全新的Task栈来加载该activity实例。

​ 当系统采用SingleInstance模式启动目标activity时,可分为以下两种情况:

​ 1.如果要启动的目标activity不存在,系统会先创建一个新的Task,再创建目标activity的实例,并将它放入栈顶。

​ 2.如果将要启动的目标activity已存在,无论它位于哪个应用程序中、位于哪个Task中,系统都会把该activity所在的Task转到前台(一般会有一个切换的画面效果),从而使该activity显示出来。

需要指出的是,采用SIngleInstance模式加载的activity总数会位于Task栈顶,且采用singleInstance模式加载的activity所在的Task只包含该activity。

在这里插入图片描述

可以看出:

这个过程中Task栈的情况:从左到右==>栈底到栈顶:


​ Task1::MainAC --> LaunchmodelAC //从主菜单界面进入到LaunchmodelAC 、


​ Task1::MainAC --> LaunchmodelAC //Task1 的情况

​ Task2::LaunchmodelAC2 //Task1 的情况,以SingleInstance方式启动 LaunchmodelAC2,新建了一个Task2,并将LaunchmodelAC2放在栈顶


​ //此时从 LaunchmodelAC2点击返回键,回到了Task1,Task2被销毁

​ Task1::MainAC --> LaunchmodelAC //Task1 的情况

​ Task2::LaunchmodelAC2 //Task2 的情况


​ //此时以SingleInstance方式启动 LaunchmodelAC2,新建了一个Task3,并将LaunchmodelAC2放在栈顶

​ Task1::MainAC --> LaunchmodelAC //Task1 的情况

​ Task3::LaunchmodelAC2 //Task3 的情况


参考:疯狂Android(第四版).237

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值