思考一下activity的启动模式

在android里,有4种activity的启动模式。分别为:“standard” (默认) “singleTop” “singleTask” “singleInstance”

standard、singleTop、singleTask、singleInstance(当中前两个是一组、后两个是一组),默觉得standard
 standard:就是intent将发送给新的实例,所以每次跳转都会生成新的activity。

singleTop:也是发送新的实例,但不同standard的一点是。在请求的Activity正好位于栈顶时(配置成singleTop的Activity),不会构造新的实例
singleTask:和后面的singleInstance都仅仅创建一个实例。当intent到来,须要创建设置为singleTask的Activity的时候,系统会检查栈里面是否已经有该Activity的实例。假设有直接将intent发送给它。
singleInstance:首先说明一下task这个概念,Task能够觉得是一个栈,可放入多个Activity。

比方启动一个应用,那么Android就创建了一个Task。然后启动这个应用的入口Activity。那在它的界面上调用其它的Activity也仅仅是在这个task里面。

那假设在多个task中共享一个Activity的话怎么办呢。举个例来说,假设开启一个导游服务类的应用程序,里面有个Activity是开启GOOGLE地图的,当按下home键退回到主菜单又启动GOOGLE地图的应用时。显示的就是刚才的地图,实际上是同一个Activity。实际上这就引入了singleInstance。singleInstance模式就是将该Activity单独放入一个栈中,这样这个栈中仅仅有这一个Activity。不同应用的intent都由这个Activity接收和展示,这样就做到了共享。

当然前提是这些应用都没有被销毁,所以刚才是按下的HOME键,假设按下了返回键,则无效


它们主要有例如以下不同:


1. 怎样决定所属task

“standard”和”singleTop”的activity的目标task。和收到的Intent的发送者在同一个task内,除非intent包含參数FLAG_ACTIVITY_NEW_TASK。

假设提供了FLAG_ACTIVITY_NEW_TASK參数。会启动到别的task里。

“singleTask”和”singleInstance”总是把activity作为一个task的根元素。他们不会被启动到一个其它task里。


2. 是否同意多个实例

“standard”和”singleTop”能够被实例化多次,而且存在于不同的task中,且一个task能够包含一个activity的多个实例;

“singleTask”和”singleInstance”则限制仅仅生成一个实例,而且是task的根元素。

singleTop要求假设创建intent的时候栈顶已经有要创建 的Activity的实例,则将intent发送给该实例,而不发送给新的实例。


3. 是否同意其他activity存在于本task内

“singleInstance”独占一个task,其他activity不能存在那个task里;假设它启动了一个新的activity,无论新的activity的launch mode 怎样,新的activity都将会到别的task里执行(如同加了FLAG_ACTIVITY_NEW_TASK參数)。

而另外三种模式,则能够和其他activity共存。


4. 是否每次都生成新实例

“standard”对于没一个启动Intent都会生成一个activity的新实例。

“singleTop”的activity假设在task的栈顶的话,则不生成新的该activity的实例。直接使用栈顶的实例,否则,生成该activity的实例。

比方如今task栈元素为A-B-C-D(D在栈顶),这时候给D发一个启动intent。假设D是 “standard”的,则生成D的一个新实例,栈变为A-B-C-D-D。

假设D是singleTop的话,则不会生产D的新实例,栈状态仍为A-B-C-D

假设这时候给B发Intent的话,无论B的launchmode是”standard” 还是 “singleTop” ,都会生成B的新实例。栈状态变为A-B-C-D-B。


“singleInstance”是其所在栈的唯一activity,它会每次都被重用。


“singleTask”假设在栈顶。则接受intent,否则,该intent会被丢弃。可是该task仍会回到前台。


当已经存在的activity实例处理新的intent时候,会调用onNewIntent()方法

假设收到intent生成一个activity实例,那么用户能够通过back键回到上一个状态。假设是已经存在的一个activity来处理这个intent的话,用户不能通过按back键返回到这之前的状态。




原文地址:https://www.cnblogs.com/gavanwanggw/p/6941811.html