Activity的启动模式

来源:互联网 发布:易语言源码图标 编辑:程序博客网 时间:2024/06/05 00:19

1、任务栈和后退栈Tasks and Back Stack

在Android中启动Activity在内部也是比较复杂的,并且这些Activity也是需要管理的。Task就是对Activity管理的。把打开,或者关闭的Activity存入到任务栈中,从而对这些Activity进行管理。

任务栈:任务栈是用来放置Activity实例的容器,以栈的形式盛放,也就是所谓的先进后出,压栈和弹栈操作。

任务栈的作用:确保Activity的启动和退出有一定的顺序,防止Activity启动的混乱。比如说,我们app中一个Activity中调用系统拍照,牌子后点击返回,该回到哪个界面中呢(如果返回相机中的某个界面,用户会感觉到很奇怪)

2、Activity的启动模式

1、Standard(默认模式)

Standard。系统在启动 activity 的 task 中创建一个新的 activity 实例,并把 intent 传送路径指向它。该 activity 可以被实例化多次,各个实例可以属于不同的 task,一个 task 中也可以存在多个实例。
这里写图片描述

2、SingleTop

如果 activity 已经存在一个实例并位于当前 task 的栈顶,则系统会调用已有实例的onNewIntent()方法把 intent 传递给已有实例,而不是创建一个新的 activity 实例。activity 可以被实例化多次,各个实例可以属于不同的 task,一个 task 中可以存在多个实例(但仅当 back stack 顶的 activity 实例不是该 activity 的)。
比如,假定 task 的 back stack 中包含了根 activity A 和 activities B、C、D(顺序是 A-B-C-D;D 在栈顶)。
这时过来一个启动 D 的 intent。如果 D 的启动模式是默认的”standard”,则会启动一个新的实例,栈内容变为 A-B-C-D-D。
但是,如果 D 的启动模式是”singleTop”,则已有的 D 实例会通过onNewIntent():接收这个 intent,因为该实例位于栈顶——栈中内容仍然维持 A-B-C-D 不变。当然,如果 intent 是要启动 B 的,则 B 的一个新实例还是会加入栈中,即使 B 的启动模式是”singleTop”也是如此。
注意: 一个 activity 的新实例创建完毕后,用户可以按回退键返回前一个 activity。 但是当 activity 已有实例正在处理刚到达的 intent 时,用户无法用回退键回到 onNewIntent() 中 intent 到来之前的 activity 状态。
这里写图片描述


使用场景:比如新闻列表界面的Activity。

3、SingleTask

单一任务栈,Activity只会在任务栈中存在一个实例,如果任务栈中已经有了,就不会创建新的,调用onNewIntent()方法,并且清空这个Activity任务栈上面所有的Activity。
这里写图片描述
系统将创建一个新的 task,并把 activity 实例作为根放入其中。但是,如果 activity 已经在其它 task 中存在实例,则系统会通过调用其实例的onNewIntent() 方法把 intent 传给已有实例,而不是再创建一个新实例。 此 activity 同一时刻只能存在一个实例。

注意: 虽然 activity 启动了一个新的 task,但用户仍然可以用回退键返回前一个 activity。


使用场景:手机浏览器

4、SingleInstance

单一实例,整个手机系统只存在一个实例,并且这个实例运行在独自的任务栈中,其他打开这个Activity,都是调用这个任务栈中的实例。

除了系统不会把其它 activity 放入当前实例所在的 task 之外,其它均与”singleTask”相同。activity 总是它所在 task 的唯一成员;它所启动的任何 activity 都会放入其它 task 中。

使用场景:打电话,发短信界面。

3、清理back stack

如果用户长时间离开某个 task,系统将会仅保留一个根 activity,而把其它 activity 都清除掉。 当用户返回 task 时,只有根 activity 会被恢复。 系统之所以这么处理,是因为经过了很长时间后,用户是要放弃之前进行的工作,返回 task 是为了开始新的工作。

你可以利用 activity 的某些属性来改变这种方式:

alwaysRetainTaskState
如果 task 中根 activity 的此属性设为 “true” ,则默认的清理方式不会进行。即使过了很长时间,task 中所有的 activity 也都会保留在栈中。
clearTaskOnLaunch
如果 task 中根 activity 的此属性设为 “true”,则只要用户离开并再次返回该 task,栈就会被清理至根 activity。也就是说,正好与alwaysRetainTaskState相反。用户每次返回 task 时看到的都是初始状态,即使只是离开一会儿。
finishOnTaskLaunch
此属性类似于clearTaskOnLaunch,只是它只对一个 activity 有效,不是整个 task。这能让任何一个 activity 消失,包括 根 activity。如果 activity 的此属性设为 “true”,则只会保留 task 中当前 session 所涉及的内容。如果用户离开后再返回 task,它就不存在了。

2 0
原创粉丝点击