Android中Task任务栈的四种模式

转载 2015年07月08日 22:50:07

首先我们来看下Task的定义,Google是这样定义Task的:a task is what the user experiences as an “application.” It’s a group of related activities, arranged in a stack. A task is a stack of activities, not a class or an element in the manifest file. 这意思就是说Task实际上是一个Activity栈,通常用户感受的一个Application就是一个Task。从这个定义来看,Task跟Service或者其他Components是没有任何联系的,它只是针对Activity而言的。
Activity有不同的启动模式, 可以影响到task的分配
Task,简单的说,就是一组以栈的模式聚集在一起的Activity组件集合。它们有潜在的前后驱动关联,新加入的Activity组件,位于栈顶,并仅有在栈顶的Activity,才会有机会与用户进行交互。而当栈顶的Activity完成使命退出的时候,Task会将其退栈,并让下一个将跑到栈顶的Activity来于用户面对面,直至栈中再无更多Activity,Task结束。
这里写图片描述

如上表所示,是一个实例。从用户从进入邮箱开始,到回复完成,退出应用整个过程的Task栈变化。这是一个标准的栈模式,对于大部分的状况,这样的Task模型,足以应付,但是,涉及到实际的性能、开销等问题,就会变得残酷许多。

比如,启动一个浏览器,在Android中是一个比较沉重的过程,它需要做很多初始化的工作,并且会有不小的内存开销。但与此同时,用浏览器打开一些内容,又是一般应用都会有的一个需求。设想一下,如果同时有十个运行着的应用(就会对应着是多个Task),都需要启动浏览器,这将是一个多么残酷的场面,十个Task栈都堆积着很雷同的浏览器Activity,
是多么华丽的一种浪费啊。
于是你会有这样一种设想,浏览器Activity,可不可以作为一个单独的Task而存在,不管是来自那个Task的请求,浏览器的Task,都不会归并过去。这样,虽然浏览器Activity本身需要维系的状态更多了,但整体的开销将大大的减少,这种舍小家为大家的行为,还是很值得歌颂的
standard”, “singleTop”, “singleTask”, “singleInstance”。

standard模式, 是默认的也是标准的Task模式,在没有其他因素的影响下,使用此模式的Activity,会构造一个Activity的实例,加入到调用者的Task栈中去,对于使用频度一般开销一般什么都一般的Activity而言,standard模式无疑是最合适的,因为它逻辑简单条理清晰,所以是默认的选择。

而singleTop模式,基本上于standard一致,仅在请求的Activity正好位于栈顶时,有所区别。此时,配置成singleTop的Activity,不再会构造新的实例加入到Task栈中,而是将新来的Intent发送到栈顶Activity中,栈顶的Activity可以通过重载onNewIntent来处理新的Intent(当然,也可以无视…)。这个模式,降低了位于栈顶时的一些重复开销,更避免了一些奇异的行为(想象一下,如果在栈顶连续几个都是同样的Activity,再一级级退出的时候,这是怎么样的用户体验…),很适合一些会有更新的列表Activity展示。一个活生生的实例是,在Android默认提供的应用中,浏览器(Browser)的书签Activity(BrowserBookmarkPage),就用的是singleTop。

singleTask,和singleInstance,则都采取的另辟Task的蹊径。
标志为singleTask的Activity,最多仅有一个实例存在,并且,位于以它为根的Task中。所有对该Activity的请求,都会跳到该Activity的Task中展开进行。singleTask,很象概念中的单件模式,所有的修改都是基于一个实例,这通常用在构造成本很大,但切换成本较小的Activity中。最典型的例子,还是浏览器应用的主Activity(名为Browser…),它是展示当前tab,当前页面内容的窗口。它的构造成本大,但页面的切换还是较快的,于singleTask相配,还是挺天作之合的。

singleInstance显得更为极端一些。在大部分时候singleInstance与singleTask完全一致,唯一的不同在于,singleInstance的Activity,是它所在栈中仅有的一个Activity,如果涉及到的其他Activity,都移交到其他Task中进行。这使得singleInstance的Activity,像一座孤岛,彻底的黑盒,它不关注请求来自何方,也不计较后续由谁执行。在Android默认的各个应用中,很少有这样的Activity,在我个人的工程实践中,曾尝试在有道词典的快速取词Activity中采用过,
是因为我觉得快速取词入口足够方便(从notification中点选进入),并且会在各个场合使用,应该做得完全独立。

大的apk 拆成 很多小的apk
●Activity的android:affinity属性
1.配置后 当启动这个activity时就先去找有没有activity的亲和力属性相同 有就加入这个
activity所在的任务中没有就新开任务
2.affinity起作用需要的条件而者具备一个:
1.intent包含FLAG_ACTIVITY_NEW_TASK标记
2.activity元素启用了allowTaskReparenting属性.

为activity设置主题theme

在实践中有这么一个需求,有一个BaseActivity,相同布局放置在这个Activity中,其他Activity继承自BaseActivity。为了使所有Activity都统一使用背景图片,一般做法...
  • anhenzhufeng
  • anhenzhufeng
  • 2015年12月25日 11:38
  • 9922

Activity启动模式与任务栈(Task)全面深入记录(上)

转载请注明出处(谢谢): http://blog.csdn.net/javazejian/article/details/52071885任务栈简单入门  最近又把两本进阶书看了一遍,但总感觉好记...
  • javazejian
  • javazejian
  • 2016年07月30日 11:37
  • 9758

Android任务和返回栈完全解析,细数那些你所不知道的细节

一个应用程序当中通常都会包含很多个Activity,每个Activity都应该设计成为一个具有特定的功能,并且可以让用户进行操作的组件。另外,Activity之间还应该是可以相互启动的。比如,一个邮件...
  • sinyu890807
  • sinyu890807
  • 2014年12月30日 09:09
  • 45548

详解android中的任务(Task)和栈(Stack)

这两天做推送,下午看了一下午的文档,有写了一下demo,现在做下总结,以免下次又忘了。应该说推送本身是比较简单的,用的是jpush。问题在于接收到推送以后,单击通知栏中推送项目后的跳转问题。嗯,,需求...
  • sobeautiy
  • sobeautiy
  • 2013年09月06日 16:03
  • 2732

android task栈和activity的关系

转载自:http://blog.sina.com.cn/s/blog_7258b50e0100xogi.html 1、Task和Activity task是能包含很多activity的栈。...
  • shw372029857
  • shw372029857
  • 2015年09月09日 16:41
  • 1085

Android原理探究:Activity任务栈Task的简单探讨

案例 某天上班,小明正在调试前些日子开发的支付宝应用内支付功能。当他兴冲冲打开支付页面,不小心把APP切到后台,等返回APP时却发现支付界面莫名其妙消失了,又发现那个支付界面又偷偷跑到了隔壁支付宝AP...
  • net_168
  • net_168
  • 2016年03月22日 21:34
  • 778

android任务栈及activity四种启动模式

一、android任务栈 栈:先进后出 队列:先进先出 任务栈Task中:打开一个Activity叫进栈 关闭一个activit出栈 任务栈是用来维护Activity的、是用来维护用户的操作体...
  • songyi160
  • songyi160
  • 2016年12月10日 21:20
  • 572

Android的任务栈以及应用场景

首先介绍一下任务栈: (1)程序打开时就创建了一个任务栈, 用于存储当前程序的activity,所有的activity属于一个任务栈。  (2)一个任务栈包含了一个activity的集合, 去...
  • cpcpcp123
  • cpcpcp123
  • 2016年10月05日 22:32
  • 368

# Android中的任务和返回栈总结

Android中的任务和返回栈任务栈的基础知识:任务是指在执行特定作业时与用户交互的一系列 Activity。 这些 Activity 按照各自的打开顺序排列在堆栈(即“返回栈”)中。为什么要用任务栈...
  • lixiaodaoaaa
  • lixiaodaoaaa
  • 2016年06月17日 16:31
  • 3016

android查看task栈

adb shell dumpsys activity
  • cubesky
  • cubesky
  • 2014年08月22日 11:39
  • 554
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Android中Task任务栈的四种模式
举报原因:
原因补充:

(最多只允许输入30个字)