今天简单了解了一下android中activity的启动模式和task内容,后面会随时补充和拓展。

android系统中的任务是如何运行的呢?当我们启动了一个手机应用时,一个task就启动了,后面可能会涉及多个activity的界面,这些activity的运行状态会被存储到Task的Activity堆栈中去。和普通的堆栈原理一样,activity的堆栈也是采用的"后进先出"原则。当我们启动一个新的activity时,它就会被push在活动堆栈的顶部,而每次按back键,当前的活动就会被弹出堆栈,而我们按home键,这时候task就会失去焦点并被保存在内存中,一旦重新启动,task便会将上次activity的界面读出并显示。

为了便于控制任务中activity的启动的控制,android为我们提供了一些方法来改变其启动模式。主要有两种方法来对其进行控制:

1.在menifest文件中的<activity/>标签中的launchMode属性对活动的启动方式进行控制:

它一共为我们提供了四种启动方式:

standard:标准模式,启动模式中的默认模式,无论打开新的activity还是intent接收消息,系统都会为该activity创建一个新的实例,缺点是太耗费资源

singleTop:如果该activity处于栈顶,即最后一个创建的activity,那么它接收intent消息或者其他activity通过intent跳转到该activity不需要重新创建一个实例,而是通过onNewIntent方法处理接收的消息,这种模式在一定程度上减少了资源浪费。

singleTask:该模式保证同一个activity在活动堆栈中只存在一个实例,而且存在于栈底。此模式比较节省资源,手机浏览器一般使用这种模式。在这种模式下,无论跳转的对象是不是位于栈顶的activity,程序都不会生成一个新的实例(当然前提是栈里面已经有这个实例)。这种模式相当有用,在以后的多activity开发中, 经常会因为跳转的关系导致同个页面生成多个实例,这个在用户体验上始终有点不好,而如果你将对应的activity声明为 singleTask 模式,这种问题将不复存在。

singleInstance:类似于singleTask,不同之处在于该模式让activity独自占据一个task,其他activity不能存在于这个task中。

2.通过设置Intent的flag属性来改变activity的启动模式

.FLAG_ACTIVITY_NEW_TASK:等同于上面的singleTask

.FLAG_ACTIVITY_SINGLE_TOP:等同于上面的singleTop

.FLAG_ACTIVITY_CLEAR_TOP:如果activity的实例已存在,该方法将会清除其所在栈的其他所有activity实例。