android task任务栈(Activity)
2015-07-16 17:44
316 查看
当当前的Activity打开其他Activities时,新打开的Activity处于back
stack的最顶端并处于用户获取焦点状态,当前的Activity被保存置于stack中,处于stopped状态。当用户点击BACK键时,stack最顶部的Activity被销毁,前一个Activity被恢复。Back
stack的操作遵循“后进先出”的原则。
当back stack中所有的Activities都出栈了,那么任务将不存在,应用程序也就随即推出。
一个Task任务是一个完整的单元,它可以运行于后台。当用户开启一个新的任务Task,或者通过HOME键跳到主屏幕时,这个任务就处于后台运行,不过这个Task包含所有的Activities都处于Stopped状态。但back
stack维护这个任务的完整数据,只是简单的被其他task替换焦点而已。
在同一时刻,允许多个任务Task运行于后台,但当系统资源不足,需要结束掉某些状态为Stopped的任务时,Activities的状态数据将被丢失。由于Activities在Task中并不支持重新排列,因此当你的一个Activity在一次应用中打开多次,那么每次都创建一个新的Activity实例,而不是引用旧的Activity实例。也就是说,一个Activity在你的应用中会多次实例化。
当然你也可以通过其他方式使得同一Activity在一个任务中只实例化一次,Task任务管理一节将介绍如何实现。
如何进行任务管理
Intents 标识有:
1、 FLAG_ACTIVITY_NEW_TASK
2、 FLAG_ACTIVITY_CLEAR_TOP
3、 FLAG_ACTIVITY_SINGLE_TOP
1、 使用manifest配置文件
2、 使用intent的标识
例子:Activity A 启动 Activity B。如果B在manifest中定义了运行模式,并且A在启动B时,也在Intent中指定了B的运行模式,那么A在Intent的定义将覆盖B在manifest中的定义。
注:有些运行模式在manifest中定义有效未必在Intent中也有效,同样,在Intent定义有效的运行模式在manifest中未必生效。
1. Standard:标准默认模式
在这种默认模式下,Activity可以被多次实例化,也可以运行在多个Task中,一个Task可以拥有多个相同的Activity实例。
2. singleTop
在这种模式下,如果一个Activity实例已经存在于当前Task的最顶部,那么系统将调用onNewIntent()方法路由到这个实例,而不是创建一个新的Activity实例,这情况仅仅存在于Activity实例不在Task任务的顶端。
A-B-C-D:再开启D,back stack中的情形:
在标准模式下,则为 A-B-C-D-D
在singleTop模式,则为A-B-C-D
如果开启B
则在singleTop模式下为 A-B-C-D-B
3. singTask
系统不是去创建一个新的实例,而是调用onNewIntent()路由到其他任务的实例。在同一时间,只存在一个Activity实例。
4. singInstance
于singTask相似,唯独一点不同的是,这个实例只能在一个Task中使用。
1、 FLAG_ACTIVITY_NEW_TASK
和 singleTask 一样
2、 FLAG_ACTIVITY_SINGLE_TOP
和singleTop一样
3、 FLAG_ACTIVITY_CLEAR_TOP
这个模式是没有属性配置支持的。在这种模式下,如果启动一个已经存在于当前Task任务的Activity,那么Task顶部所有的Activity将被销毁,并且为将要启动的Activity新建一个Activity实例,存放在task的back
stack的顶部。
以下属性可以设置并改变这种行为方式:
alwaysRetainTaskState:如果在Task的跟Activity中设置这个属性为true,默认的行为将不再发生,所有Activity的状态数据将永久保存。
clearTaskOnLaunch:如果在Task的跟Activity中设置这个属性为true,当用户离开或者回到这个Task时,都会清理除了跟Activity之外的Activity
finishOnTaskLaunch:类似clearTaskOnLaunch ,但只在一个Activity中生效,而不是整个Task,它可以清理任何的Activity,包括跟Activity。你保存的Activity,当用户回来或者离去,都不将再恢复呈现。
转载于:http://blog.163.com/cazwxy_12/blog/static/898763720122992149143/
stack的最顶端并处于用户获取焦点状态,当前的Activity被保存置于stack中,处于stopped状态。当用户点击BACK键时,stack最顶部的Activity被销毁,前一个Activity被恢复。Back
stack的操作遵循“后进先出”的原则。
当back stack中所有的Activities都出栈了,那么任务将不存在,应用程序也就随即推出。
一个Task任务是一个完整的单元,它可以运行于后台。当用户开启一个新的任务Task,或者通过HOME键跳到主屏幕时,这个任务就处于后台运行,不过这个Task包含所有的Activities都处于Stopped状态。但back
stack维护这个任务的完整数据,只是简单的被其他task替换焦点而已。
在同一时刻,允许多个任务Task运行于后台,但当系统资源不足,需要结束掉某些状态为Stopped的任务时,Activities的状态数据将被丢失。由于Activities在Task中并不支持重新排列,因此当你的一个Activity在一次应用中打开多次,那么每次都创建一个新的Activity实例,而不是引用旧的Activity实例。也就是说,一个Activity在你的应用中会多次实例化。
当然你也可以通过其他方式使得同一Activity在一个任务中只实例化一次,Task任务管理一节将介绍如何实现。
如何进行任务管理
Intents 标识有:
1、 FLAG_ACTIVITY_NEW_TASK
2、 FLAG_ACTIVITY_CLEAR_TOP
3、 FLAG_ACTIVITY_SINGLE_TOP
运行模式介绍
你可以通过定义运行模式来定义Activities如何与Task进行交互。定义的两种方式如下:1、 使用manifest配置文件
2、 使用intent的标识
例子:Activity A 启动 Activity B。如果B在manifest中定义了运行模式,并且A在启动B时,也在Intent中指定了B的运行模式,那么A在Intent的定义将覆盖B在manifest中的定义。
注:有些运行模式在manifest中定义有效未必在Intent中也有效,同样,在Intent定义有效的运行模式在manifest中未必生效。
如何使用manifest配置管理
在manifest配置文件中,你可以通过Activity的launchMode属性来指定4中不同的运行模式。1. Standard:标准默认模式
在这种默认模式下,Activity可以被多次实例化,也可以运行在多个Task中,一个Task可以拥有多个相同的Activity实例。
2. singleTop
在这种模式下,如果一个Activity实例已经存在于当前Task的最顶部,那么系统将调用onNewIntent()方法路由到这个实例,而不是创建一个新的Activity实例,这情况仅仅存在于Activity实例不在Task任务的顶端。
A-B-C-D:再开启D,back stack中的情形:
在标准模式下,则为 A-B-C-D-D
在singleTop模式,则为A-B-C-D
如果开启B
则在singleTop模式下为 A-B-C-D-B
3. singTask
系统不是去创建一个新的实例,而是调用onNewIntent()路由到其他任务的实例。在同一时间,只存在一个Activity实例。
4. singInstance
于singTask相似,唯独一点不同的是,这个实例只能在一个Task中使用。
如何使用Intent配置管理
在启动Activity时,你可以通过传递一个Intent入参给startActivity()方法,来实现与manifest配置类似功能,改变Activity在task中的行为。1、 FLAG_ACTIVITY_NEW_TASK
和 singleTask 一样
2、 FLAG_ACTIVITY_SINGLE_TOP
和singleTop一样
3、 FLAG_ACTIVITY_CLEAR_TOP
这个模式是没有属性配置支持的。在这种模式下,如果启动一个已经存在于当前Task任务的Activity,那么Task顶部所有的Activity将被销毁,并且为将要启动的Activity新建一个Activity实例,存放在task的back
stack的顶部。
如何清理回收栈back stack
如果一个用户离开一个Task很长时间,系统会清理这个Task,当然除了跟Activity。当用户回来时,只剩下这个跟Activity,其他的都被销毁了。以下属性可以设置并改变这种行为方式:
alwaysRetainTaskState:如果在Task的跟Activity中设置这个属性为true,默认的行为将不再发生,所有Activity的状态数据将永久保存。
clearTaskOnLaunch:如果在Task的跟Activity中设置这个属性为true,当用户离开或者回到这个Task时,都会清理除了跟Activity之外的Activity
finishOnTaskLaunch:类似clearTaskOnLaunch ,但只在一个Activity中生效,而不是整个Task,它可以清理任何的Activity,包括跟Activity。你保存的Activity,当用户回来或者离去,都不将再恢复呈现。
转载于:http://blog.163.com/cazwxy_12/blog/static/898763720122992149143/
相关文章推荐
- 使用C++实现JNI接口需要注意的事项
- Android IPC进程间通讯机制
- Android Manifest 用法
- [转载]Activity中ConfigChanges属性的用法
- Android之获取手机上的图片和视频缩略图thumbnails
- Android之使用Http协议实现文件上传功能
- Android学习笔记(二九):嵌入浏览器
- android string.xml文件中的整型和string型代替
- i-jetty环境搭配与编译
- android之定时器AlarmManager
- android wifi 无线调试
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- android 代码实现控件之间的间距
- android FragmentPagerAdapter的“标准”配置
- Android"解决"onTouch和onClick的冲突问题
- android:installLocation简析
- android searchView的关闭事件
- SourceProvider.getJniDirectories