Tasks and Back Stack
Activiyty的最后一篇了,其实这上一篇讲的是 Loaders 只是我不太理解,也没怎么用过。唉~ 还得去慢慢探索,懂了以后再记下来只能!
先看Tasks,什么是Tasks呢? 为此我还特地百度翻译了一波,工作,任务。而且还是负数,多项工作,多项任务?
是的,官方文档(小菜看的中文文档)的说法是 “多个Activity的集合,用户进行操作时将与这些Activity进行交互”,对啊,那就很好理解了,Android应用中也是主要靠多个Activity与用户交互的。那么这个东西有什么用呢?
官方给了一个发送Email的例子,实际上有很多和这个类似,比如:视屏或者某个网址打开时,让我们选择不同应用来打开(前提这些不同应用的action都支持这个Intent请求),在完成这些操作后,你自己的Activity会恢复,实际上是两个应用,但是这两个应用的两个activity都放入了同一个Tasks,哎呀,(官方:保证了无缝的用户体验)。
不想写了呢!感觉挺好理解的,结合自己手机的时候
那我就结合玩手机来写?(可能不一定对哦!)
哎呀,我想找妹子聊天,我们手指点击QQ application launcher 中的图标(企鹅?),该应用程序的task就进入前台,如果该应用不存在task(最近没使用过),会新创建一个task,该应用的“main”activity 作为栈的根 activity 被打开。带引号的main,应该是指应用的启动项为根activity吧。发完消息了,我们点击Home键,回到我们桌面,这时我又要去 微信看看
,点击微信图标,这时候,执行的是另外一个task,而之前的task进入后台,并且其中的返回栈(back stack)也保存在后台,同时会为新的task创建新的返回栈,我们再次回到桌面点击QQ图标时,我们可以看到,是之前我们发消息的界面,并没有重新创建,实际上,之前的返回栈恢复到前台了,并执行其栈顶的activity(即最后我们停留的activity界面‘后进先出’)。知道了这些,就大概清楚我们平时玩手机的时候,来回切换应用,还可以回到我们之前停留的界面了吧。但是,如果有太多的task,系统会杀死一些task释放内存。这就解释了,有时候我们开了好多东西没有退出,再次点击之前的应用的时候,又从欢迎界面(启动项)重新计入了。
我们在来说说有关 Back stack的东西。
我们进入QQ,从主界面点击某个人进入发消息界面,从MainActivity(主界面)进入InfoActivity( 发消息界面 ),这时候infoActivity被压入栈顶并获得焦点,MainActivity仍然在栈中,只是被停止,但是保存进入infoActivity之前的状态,即如果我们点击某个人前是进入联系人里在分组里面找的人而不是进入的消息界面找的人的话(感觉被我说的复杂了?渣渣,这个根本不需要解释啦,废话好多,只有你不懂? ),我们点击返回键时,回到的是点开分组那时的状态,而当前也就是InfoActivity被销毁了,这就是"后进先出"了吧。
当我们一直重复点返回键,栈中的activity会依次弹出,直到回到桌面,这时候栈中所有activity都弹出,task也消失。
保存Activity状态
系统会在activity停止时,默认保存其原有状态,但是当处于内存需要时,这个停止的Activity会被销毁,这样这个activity的状态信息也就丢失了。这时候我们可以主动存储这些内容,通过实现onSaveInstanceState()回调即可。
定义启动模式
一,使用manifest文件
在<activity>元素的lanchMode属性来设定activity与task的关系
lanchMode的四种模式:standard,singleTop,singleTask,singleInstance (挺好理解的,不太懂的小伙伴去敲几个一下就明白了)(记下这个好了onNewIntent())
二,使用Intent标志
在startActivity();时
intent.addFlags(FLAG_ACTIVITY_NEW_TASK);//基本与上面四种模式对应的
清理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,它就不存在了。
OK~~