Android 中 Activity,Task,Stack 以及 Launch Mode 的一些说明

Acitivty 是 Android 应用框架中最主要的组件之一。可以 Task/ Stack 的机制来管理 Activity 的行为模式。在 Android 的官方文档里已经对 Activity 的属性以及 Task/Stack 的概念进行了说明。在《应用程序基础》一文中也有对这一主题的相关说明。这里专门对此进行进一步的说明。

Stack 保存了一个应用程序的所有没有被销毁(destroy)的 Activity。例如依次启动了 A、B、C 三个 Activity 之后,该 stack 的状态即为 |A-B-C。当 C 执行了 finish() 方法或是用户点击了返回键之后,stack 的状态变为了 |A-B。

而 task 则可以理解为是在 stack 中对 activity 进行了一种分组。例如:|1A-1B- 2A-2B-2C- 3A 中根据后缀可以分为三个不同的 task。这时所显示的是 3A,三个 task 的根 Activty 分别是 1A、2A、3A。通常,一个 task 中的 activity 是成组移动的。例如通过长按 HOME 键选择了 2C 之后,stack 将变为 |1A-1B- 3A- 2A-2B-2C。默认情况下,所有的 activity 将会属于同一个 task。不过各个 activity 之间的从属关系也能够通过 taskAffinity 被重新定义。而如果 Intent 对象含有 FLAG_ACTIVITY_NEW_TASK 旗标,则将会选择一个新的 task。

不同的启动模式也会影响 task 的分配:

如果用户长时间不使用一个 task,该 task 就会被清除以释放内存。不过根 Activity 将会被保留。例如:|1A-1B- 2A-2B-2C- 3A 在这种情况下将变为 |1A- 2A- 3A。如果将根 Activity 的 alwaysRetainTaskState 属性设为 true,则该 task 中的所有活动都将被始终保留。如果将根 Activity 的 clearTaskOnLaunch 属性设为 true,则在用户离开该 task 时包括根 Activity 在内的这一 task 将被完整清除。如果将 task 中的某个 Activity 的 finishOnTaskLaunch 属性设为 true,则在离开该 task 并返回之后,这一 Activity 将被清除。

漫谈 Android 产品的系统升级问题——从 Xperia S 漫长的 Jelly Bean 等待说起

今天索尼移动(Sony Mobile)的官方博客发表了 Xperia P、 Xperia go 与 Xperia E dual 的 Android 4.1 系统升级通知。这三台2012年的中低端机型将在近日得到 Android Jelly Bean(4.1.2)这一次新版本的系统升级。而 Xperia S、Xperia SL、Xperia ion 以及 Xperia acro S 这四台2012年上半年的旗舰,则需要等到5月底才能得到升级——这距离 Google Android 团队发布4.1版本已经过去了11个月。

于是,评论中清一色的骂声。决定抛弃索尼甚至将会阻止朋友购买索尼的手机的声音不绝于耳。虽然网络不免有放大某种声音的倾向,但不可否认的是,索尼这次做得很糟。

很容易就能明白,索尼在对2012年上半年旗舰的处理上,出了一些问题。2012年下半年机型的 Xperia TX、Xperia V 等旗舰及时地得到了 Android 4.1 的升级,之后的很多机型更是在出厂时就预装了 Jelly Bean。甚至2012年上半年的中低端机型也更早地得到了升级。这只能是决策失误。

尽管名义上,Xperia S 是索尼移动的第一款手机,但众所周知,其实它是索尼爱立信的最后一部手机。在系统信息、照片的 Exif 信息,以及日版 Xperia S(Xperia NX)的正面 Logo 中,都能很清楚地了解到这一事实。

于是可以展开的合理想象之一是:在索尼收购了索尼爱立信之后,一些环节出了问题。缺少人手为这些索尼爱立信最后的遗产提供支持。新的领导层将资源都调至了之后那些纯正索尼血统的设备上。他们或许是期望那些新机型能够获得消费者的支持——这是能够被理解的,那些型号将会有更高的总销量,对 Xperia 的品牌形象有着重要的意义,但与此同时,索尼付出了代价。购买了 Xperia S 的人中,有很大一部分是对索尼抱有好感的,为了这第一部标有 SONY 字样的索尼爱立信的手机。另一个方面来说,作为去年的旗舰,花了高价购买的人无疑是品牌重要的消费者。确保这些人对品牌的忠诚度是极为重要的。不是 Geek,不理解这些消费者想法的决策者,恐怕想不明白其中的问题所在吧。从短期的数字上来看,或许这不是一个太坏的决定,但却会实实在在地伤害了一部分支持者的感情。

三星等其他一些厂商早就学会了通过及时的系统升级来取悦消费者。索尼却没有学会,至少没有学好。索尼对2011年机型的升级是令人满意的,大部分都得到了 Android 4.0 的升级。而2012年所采取的机海战术又使情况退回了2010年。资源不足导致索尼只能优先考虑一部分机型——却又错误地选择了放弃了2012年上半年的旗舰。或许索尼决定在今后以中高端机型为主也是出于这一考虑,但消费者恐怕没有耐心等待索尼一次次的试错。

在 Android 的时代,及时的系统更新对于厂商的意义是很重大的。不理解这一点是不行的。

在诺基亚(Nokia)主导的塞班时代,没有这一问题。消费者根本也就不在乎系统升级。而苹果(Apple)能够完全掌控自己的软硬件,也就不存在升级延迟的问题了。但 Android 是不同的。Android 的系统升级是由 Google 控制的。厂商需要做的,是跟进。于是,对产品进行系统升级的速度也成了衡量产品好坏的标准之一——大多数的人总是倾向于新的东西,即使他们并没有考虑更多。

当然,通常情况下,新版本的软件确实会包含错误的修正、性能的提高,以及功能的增强。用户希望自己的设备随时保持最新——就像苹果所提供的那样——是无可厚非的,是必须正视的问题。于是,这就转为了一个简单的平衡问题。对旧产品的支持意味着额外的成本,但不提供支持则意味着失去一部分消费者的支持。固然有完全不知系统升级为何物的消费者,而且数量与比重不会太小,但那些在乎升级的人却往往是可以影响品牌形象的消费者。如何在两者之间权衡,固然不是一个简单的问题。

这个时候至少应该注意的是,不能将注意力限于眼前的利益。最终的决策或许需要实际的数据与调查来支持(虽然从自己所了解的一些情况来看,那些咨询公司等所能给出的材料并不总是那么有价值的),但绝不应该忽视这一问题所可能带来的影响。

索尼移动并不是一家新成立的公司,现在它试错的次数显然是有些过多了。当初 Xperia X10 的教训似乎是没有让管理层意识到问题的严重性。其实,索尼自身也存在着这样的问题,在其平板产品中。“索尼的弱点在于软件”在这些方面得到了充分的体现。

自己对于索尼这样的做法,是持质疑态度的。业绩不佳时更不能一味地考虑节流,只有尽全力开源才是正道。如果软件是短板,就应该招贤纳士,想办法提高自己产品的软件水平——它们明明在那些充满创造力的工程师的努力下,取得了一个个世界最薄·最小·最轻量的荣誉。如果因为软件问题而无法为消费者称赞,实在是一件可惜的事。

索尼中国在去年秋季的校园招聘中,对于软件开发类的职位仅仅是走了一个形式,而没有实际进行招聘。甚至校招的笔试题都是水准极低的敷衍——竟然为 C++ 职位准备了由几道没有什么实际意义的 Android 问题组成的笔试试卷。难怪不少人会当场气愤地离场。

问题出在哪里了呢?