Activity 四种启动模式

Activity生命周期,两个重要方法:onResume() onPause()
https://blog.csdn.net/xuyong282373443/article/details/73294308

1 四种启动模式的由来

当多次启动同一个Activity时,系统会创建多个实例,并把它们按照先进后出的原则,放入任务栈中。当我们按 back 键时,就会有一个 Activity 从任务栈顶移除,重复下去,直到任务栈为空,系统就会回收这个任务栈。但是,这样,系统多次启动同一个 Activity,就会创建多个实例,这种做法显然不合理。为了优化这个问题,Android 提供 4种启动模式,来完善系统这一默认行为。

2 Activity 4种启动模式:

standard, singleTop, singleTask, singleInstance

  • standard模式

这个模式是默认启动模式,即标准模式
每次启动一个Activity,都会重新创建一个新的实例,不管这个实例存不存在
这种模式下,谁启动了该模式的Activity,该Activity就属于启动它的Activity的任务栈中

  • singleTop — 栈顶复用模式

这个模式下,如果新的 Activity,已经位于栈顶,那么这个 Activity不会被重新创建,同时它的 onNewIntent方法会被调用。如果栈顶不存在该Activity的实例,则情况与 standard模式相同

总结:

standard启动模式是默认的启动模式,每次启动一个Activity都会新建一个实例,不管栈中,是否已有该Activity的实例
singleTop模式分3种情况

当前栈中,已有该Activity的实例,并且位于栈顶时,不会新建实例,而是复用栈顶的实例,并且会将 Intent对象传入,回调 onNewIntent方法
当前栈中,已有该Activity的实例但是不在栈顶,和 standard一样,会创建一个新的实例
当前栈中不存在该Activity的实例,其行为同standard启动模式

standard和singleTop启动模式,都是在原任务栈中,新建Activity实例,不会启动新的 task,即使指定了 taskAffinity属性

taskAffinity属性,可以简单的理解为 任务相关性

  • 这个参数标识了一个Activity所需任务栈的名字,默认情况下,所有Activity所需的任务栈的名字为应用程序的包名
  • 我们可以单独指定每一个Activity的 taskAffinity属性,覆盖默认值
  • 一个任务的 affinity 决定于这个任务的根 activity(root activity)的 taskAffinity
  • 在概念上,具有相同的 affinity的 activity(即设置了相同 taskAffinity属性的 activity)属于同一个任务
  • 为一个 activity 的 taskAffinity 设置一个空字符串,表明这个 activity 不属于任何 task
  • singleTask — 栈内复用模式

这个模式最常用,十分复杂,有各式各样的组合。在这个模式下,如果栈中存在这个Activity的实例,就会复用这个Activity,不管它是否位于栈顶。复用时,会将它上面的Activity全部出栈,并且会回调该实例的 onNewIntent 方法。
这个过程,还存在一个任务栈的匹配。因为这个模式启动时,会在自己需要的任务栈中寻找实例,这个任务栈就是通过 taskAffinity属性指定
如果这个任务栈不存在,则会创建这个任务栈

总结:

singleTask模式,启动 Activity时,首先会根据 taskAffinity去寻找当前是否存在一个对应名字的任务栈

如果不存在,则会创建一个新的 Task,并创建新的Activity 实例,入栈到新创建的 Task中去
如果存在,则得到该任务栈,查找该任务栈中是否存在该Activity实例

如果存在实例,则将它上面的Activity实例都出栈,然后回调启动的 Activity实例的 onNewIntent方法
如果不存在该实例,则新建 Activity,并入栈

  • singleInstance模式

该模式具备 singleTask模式的所有特性外,与它的区别就是,这种模式下的 Activity,会单独占用一个 Task栈,具有全局唯一性。即整个系统中就这么一个实例。以 singleInstance 模式启动的 Activity 在整个系统中是单例的,如果在启动这样的 Activity时,已经存在了一个实例,那么会把它所在的任务调度到前台,重用这个实例。

https://blog.csdn.net/sbsujjbcy/article/details/49360615

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值