android学习记录(十三)Task 和 Activity 回退栈操作。
首先说一下Task是一个什么概念吧:Task是一个包括activity的列表。没
错。简单的说就是依照启动的先后来排队的一个队列。Back Stack。就是回退栈的意思:那么有什么用?Back
Stack是存储一个Task的实现方式,一个容器。它具有栈的特性:后进先出。
那么。根据什么来把activity指定给某个Task?
------默认情况下,依据activity的启动的顺序。增加A启动了B。那么B默认情况下就放到了
A的Task的Back
Stack里面啦。
当然,你也能够去改动这一个默认的行为。在以下的一些部分会讲述怎么去改动的啦。
须要注意的一点是:假如一个activity在一个新的task里启动且没有其它直接启动的方法(即不是Main,Launch的activity),然后按下Home键离开了该Task,然后通过启动图标来返回应用的话。是无法回到该activity的。
1.保存activity的属性和状态:
默认情况下,当activity脱离前台进入后台执行的时候,系统会自己主动保存它的配置信息,当用
户返回到activity的时候,能够自己主动的复原.
然而当过了比較长的一段时间后或者系统须要回收内存什么的,会清除掉它的配置信息,当
用户返回到该activity的时候会又一次的启动该activity.
那么这样的情况下假设要把曾经做的又一次再来一遍,这用户体验想想就认为不妥啊.那么我
们须要自己去保存和恢复activity的配置信息.then ,how?
实现onSaveInstanceState()方法,把所需的属性信息保存到bundle里.
在onCreate()方法里会有一个Bundle參数,假设不为空的话证明了之前是有一些信
信息是保存在这里的,我们就能够利用里面的信息去恢复用户原本处于的状态,这样子用户的体验是不是就好狠多啦?嘿嘿嘿嘿嘿
2.管理Task
如开头所说。我们能够改动系统的默认行为(即假设A启动了B。会把B放入A所在的Task和Back
Stack里)。那么,有两种方式能够做到:
A.在startActivity(Intent
intent)的intent中定义flag:
intent.setFlags(flag);
系统会依据intent所定义的flag来对所被启动的activity来指定特定的Task。
B.在Manifest文件里该activity标签下的属性
- taskAffinity
- launchMode
- allowTaskReparenting
- clearTaskOnLaunch
- alwaysRetainTaskState
- finishOnTaskLaunch
相同系统会依据属性里所定义的值来对被启动的activity进行指定task。
在这两种方式中,有一些效果是flag有而manifest文件没有的。相同也有一些效果
值是manifest文件有而flag所没有的。
当这两个值被同一时候设置的时候。flag的效果会覆盖launchMode所设置的效果。
以下,我们分别来对这两种不同方式的经常使用值来做简单的介绍。
一。定义启动activity的mode;
如果A>>B>>C
A:定义manifest文件中launchMode属性:
"standard" (默认值):
这是launchMode的默认值,假定C的launchMode为该值,若B启动C那么C也会放到B所属的Task里。C能够被初始化(即启动)多次,可属于不同的Task(即若与B不同Task的D启动了C,那么C新建一个实例放到D所在的Task里);一个Task里能够有多个C的实例(即若A>>B>>C>>A>>C,那么该任务的回退栈里有两个C的实例)
"singleTop"
中文意思是:顶部唯一。假定C的launchMode的属性值为该值。
什么意思呢?就是说,在一个Task的顶部,仅仅能有一个C的实例,即若A>>B>>C然后在C里再次startActivity
C,不会再创建一个C的实例,而是把该启动C的Intent传入到CActivity的
onNewIntent()方法里。回退栈的结构依旧是:A>>B>>C而不是A>>B>>C>>C.这种话,就会出现一个随之产生的结果:不论什么时候C的实例都不会连续出现两次。相同与默认值类似,C也能够属于不同的Task(C无论任务是谁。它仅仅跟着动了它的activity在一起),单个Task里能够有多个C的实例。
(但不会出现连续)
"singleTask"
(中文:单个任务)假定activityC的launchMode值设置为该值。那么意味着不管何时C被启动,它都会在一个独立的Task里启动。
只是注意哦,独立的Task并非意味着新的Task。当C的独立的Task已经存在(即C被启动过)了,那么当再次调用C
Activity的时候。就不会再创建了。而是把该Task移到前台来。(这也意味着,在同一时间。仅仅会有一个C的实例存在。)
注意:虽然C的Task并非与B的Task一致,但当用户按下backbutton的时候仍然能够回到B。
还有C的单独的Task里也能够有其它的Task,同一时候C并不一定要求是该任务的根activity。
"singleInstance".
(中文:单例)假定C定义了该模式。
singleTask的mode也有单例效果,但该模式与singleTask不同的是,C所在的Task里仅仅能有它自己一个Activity,不会包括其它activity。(突然就想到:假设B启动了C。然后C启动了D,那么D是在还有一个新的Task里还是B所在的Task里呢?假设有人知道希望能够分享一下哈~)
这里有一个关于singleTask的图解嘿嘿,来自官方guide文档》》》》
图的下方有备注~自己琢磨琢磨吧。挺easy懂的了。
B.Intent的Flag属性
如果回退栈里有A>>B>>C |
(A启动B。B启动C): |
- FLAG_ACTIVITY_NEW_TASK
- 效果与launchMode的singleTask属性一样。
- 当在C启动D的intent中定义了这个flag的时候。D会启动放置在一个新的Task里。即一个新的Back
Stack里。假设D已经被启动过一次然后到了后台执行(即A>>B>>C>>D>>E)再从E去启动D使用这一个flag的话,不会再次创建一个Task。而是把之前的D所在的Task恢复到前台,而D也会接收到一个Intent通过onNewIntent()方法。
@Override
protectedvoid onNewIntent(Intent intent) {
super.onNewIntent(intent);
}
- FLAG_ACTIVITY_CLEAR_TOP
- 中文(清除activity的前方)如果C定义了该属性。
- 假设A>>B>>C>>D>>E。然后E启动activity
C,那么并不会再创建一个C的实例,而是清除C前面的activity,恢复C的状态,显示C给用户看嘿嘿嘿,多霸气。 - 同一时候,manifest文件里launchMode并没有与之相应的属性值。
- FLAG_ACTIVITY_SINGLE_TOP
- 与launchMode中的singleTop属性效果一样。
回退栈的清空
默认情况下,假设用户长时间不反悔该回退栈。那么因为种种原因(回收内存节省资源等等啦),会对该回退栈进行清空处理,仅仅留下一个最底部的activity留在栈内。所以当用户返回到这个Task时。仅仅会修复呈现栈最開始的一个activity。
相同,我们也能够对这样的默认的行为作出改动:
alwaysRetainTaskState
当这个回退栈的根activity的该属性被设置为true时,那么不管用户隔了多长时间再回来,这个栈都不会被清除。
但要注意的是,必需要把该属性定义在回退栈的根activity才有效。
clearTaskOnLaunch
这个属性与alwaysRetainTaskState属性的效果刚好相反。
仅仅要用户一离开当前的Task。那么回退栈就会被清空仅仅留下根activity。
就算是刚离开又立即点击回来也是如此。相同该属性也必须定义在某个Task的根activity上才有效。
finishOnTaskLaunch
这个属性有点像clearTaskOnLaunch的属性效果,但与之不同的是它所作用的范围是单个activity(不论什么activity都行)而clearTaskOnLaunch的作用域是整个Task。被定义了该属性的activity会在用户离开所在Task之后被清除。(仅仅是清除Task里的这个activity。
taskAffinity属性及其用法:这个。。感觉比較少用啊,。。(说实话就是我比較懒)假设想要了解一下的话自行查阅哈。
官方guide文档里的Task and
Back Stack里有的。
android学习记录(十三)Task 和 Activity 回退栈操作。的更多相关文章
- Android学习记录(8)—Activity的四种加载模式及有关Activity横竖屏切换的问题
Activity有四种加载模式:standard(默认), singleTop, singleTask和 singleInstance.以下逐一举例说明他们的区别: standard:Activity ...
- Android学习记录(3)—Android中ContentProvider的基本原理学习总结
一.ContentProvider简介 当应用继承ContentProvider类,并重写该类用于提供数据和存储数据的方法,就可以向其他应用共享其数据.虽然使用其他方法也可以对外共享数据 ...
- 九、Android学习第八天——广播机制与WIFI网络操作(转)
(转自:http://wenku.baidu.com/view/af39b3164431b90d6c85c72f.html) 九.Android学习第八天——广播机制与WIFI网络操作 今天熟悉了An ...
- mono for android 学习记录
C#开发Android应用实战(全 扫描 中文版) 学习记录: 拖完控件后,不要急着按F5,需要重新生成,才能自动修改 Resource.Designer.cs 文件 1. Activity 是基于a ...
- Android学习总结(一)——Activity的基本概念与Activity的生命周期
一.Activity的基本概念 Activity是Android的四大组件之一,它是一种可以包含用户界面的组件,主要用于和用户进行交互,比如打电话,照相,发送邮件,或者显示一个地图!Activity用 ...
- Android学习笔记二之初始Activity
初识Activity,跟着教程学习敲了一遍这一章的内容,下面根据目录结构总结知识点: 一.活动是什么 上篇博文中我们提到了Android四大组件,其中有一个Activity,我们将之称为活动.活动是最 ...
- Android学习笔记(一)——Activity简介 和 View
源文链接:http://www.cnblogs.com/shyang--TechBlogs/archive/2011/03/14/1984195.html Android SDK ( Software ...
- android 学习记录-----------android 活动 意图 碎片
将此篇博客作为记录android项目开发过程中的学习记录
- 中级实训Android学习记录——Toast、AlertDialog、ProgressBar
学习记录 2020/11/22 Toast Toast Toast是一个消息提示组件 我们可以设置其显示的位置 自定义其显示的内容 对Toast的简单封装可以达到不同的目的 Toast的默认用法 To ...
随机推荐
- 恢复SD卡错删数据
对于众多米粉来说,手机里存储的很多资料都非常宝贵,如果不小心删除了,想要重新收集这些资料就显得非常困难.有道是千金易得,数据无价,特别是一些珍贵照片之类的充满回忆的数据,丢失了甚至会抱憾 ...
- (转)Visual Studio原生开发的10个调试技巧(二)
我以前关于Visual Studio调试技巧的文章引起了大家很大的兴趣,以至于我决定分享更多调试的知识.以下的列表中你可以看到写原生开发的调试技巧(接着以前的文章来编号).这些技巧可以应用在VS200 ...
- vbScript常用运算符与函数
基本运算 + 数字加法及字符串连接 - 数字减法 * 数字乘法 / 数字除法 Mod 求余数 \ 求商数 & 字符串连接 ^ 次方 = 相等 <> 不相等 >= 大于或等于 ...
- MVC的路由
MVC的路由包括以下几部分 路由名称,路由URL,路由的初始值,路由的约束,路由的命名空间 routes.MapRoute( name: "Default", url: " ...
- gcc命令行详解
介绍] ----------------------------------------- 常见用法: GCC 选项 GCC 有超过100个的编译选项可用. 这些选项中的许多你可能永远都不会用到, 但 ...
- wpf4 文字 模糊 不清晰 解决方法
在窗口或控件上设置字体属性就可以了,如下:<UserControl x:Class="..." xmlns="http://schemas. ...
- 应用删除后 Launchpad 上仍有应用图标无法删除的解决方法
应用删除后 Launchpad 上仍有应用图标上带有问号且无法删除时,可以将 launchpad 重置. 在终端输入: defaults write com.apple.dock ResetLaunc ...
- 第二百零三天 how can I 坚持
空虚的有点害怕. 日复一日. 今天做了什么?下班看了个搞笑段子. 上班和刘松聊了一下午,东扯西扯的. 下班玩了两局dota. 想租车去出去玩玩,确实没有什么想去的地方了. 莫巧菲. 哎,未来好可怕啊. ...
- 借助LVS+Keepalived实现负载均衡(转)
原文:http://www.cnblogs.com/edisonchou/p/4281978.html 一.负载均衡:必不可少的基础手段 1.1 找更多的牛来拉车吧 当前大多数的互联网系统都使用了服务 ...
- Instagram的技术探索2(转)
原文:http://www.cnblogs.com/xiekeli/archive/2012/05/28/2520770.html 前一篇翻译了Instagram blog上的一篇文章<What ...