Android官方文档之Activity和Task
什么知识,看官方的API是最好的了。但是鉴于很多人英语不好,便转载了这篇文章,翻译的非常好了。搞不懂Activity声明周期,和程序框架设计的,最好看一看。
Activity 和 task 的设计摘要
Activity 是 Android 应用的主要组成部分。
除了自己写Activity之外,你还可以利用intent,轻松地重用其它应用的Activity。
你可以让你应用里的Activity能被其它应用通过intent使用。
系统的Activity栈几乎可以处理所有的情况。不过有两种情况你大概需要自己设置flag之类,来确定the right thing happens。
在本文档中
Applications,Activity,Activity栈和Task
Activity和Task的一个例子
从主屏开始一个Activity
离开一个Activity
重用一个Activity
替换Activity
多Task
从两个进入点启动应用
Intent
在Task之间切换
设计建议
如果你不想你的Activity被重用,不要使用intent filter
注意处理用intent找不到activity的情况
考虑启动应用的方式
允许Activity加入到当前Task中来
Notification应该让你的用户很容易离开
使用Notification系统
如果不是绝对必要,不要自己控制BACK键
参考
Application基础
这个文档,从高层的、以用户为中心的视角,描述了Android应用框架的 核心原则。这对交互和应用设计者和应用开发者是有用的。
本文用多个例子说明了Activity和Task,而且描述了一些它们的底层原则和 机制,像导航,多Task,Activity重用,Intent和Activity栈。 文档还强调了一些你能用到的设计结论,和你如何控制你应用的UI。
这个文档使用了很多Android应用作为例子,包括一些默认应用, 例如Dialer,以及Google应用,例如Maps。你可以在你的Android模拟器 或者Android的手机上试试它们。注意你的手机或许只提供一部分这些文档 中的例子应用。
在设计建议部分中,会提到一些原则、 建议、和要避免的事情。Application基础覆盖了程序的底层 机制,本文档是对它的补充和完善。
Applications,Activity,Activity栈和Task
以下四个基本概念有助于你的理解:
Application
Activitie
Activity栈
Task
Application
一个典型的Android Application由一个或多个相关的、松耦合的、用户可以 与之互动的Activity组成。典型的情况,是一个Application打包进 一个单独的apk文件里。Android会伴随着一大票的应用,可能包括电子邮件、日历、浏览器、地图、 短信、联系人、拍照、拨号、音乐播放、设置等等。
Android主屏一般就是应用启动者。一般来说,是一个有很多应用图标的滑动抽屉(就是默认Android系统下面那个,用手指往上一拖就出现很多图标的那个东西。),用户可以从上面启动应用。
Activity
Activity是Android应用的主要组成部分。 当你建立Apllication的时候,你可以自己建立的Activity或者重用其它Application的Activity,来组装Application。 这些Activity是在运行时绑定在一起的,所以,新安装的Application能从已安装的Activity中获益。 一旦组合在一起,这些Acitivity会像一个整体那样一起工作。 一个Activity拥有一个独立的可视UI,这个UI应该基于单独的、明确界定的意图。 例如看图、编辑、拨号打电话、拍照、搜索、发送数据、语音命令等等其他用户行为。 一个需要界面显示的Application至少要有一个Activity。
当使用一个Android设备时,用户会从一个界面跳到另一个界面,这种跳转应该是流畅的。 不应该让用户察觉那些底层的行为,比如Activity间或者Task间的切换。
一个Activity持有了一种特定种类的内容(数据),以及接受一系列相关的用户动作。 一般来说,每个Activity的生命周期,与其他的同一个Application或Task内的Activity是无关的。 每一个Activity独立地被运行,用户或者系统可以按需要start、run、pause、resume、stop或者restart这些Activity。 由于这种独立的特性,有很多种方法可以覆盖或者重用Activity。
Android提供的拨号程序就是一个Activity组合的例子。这个程序是由4个Activity组合成的: 拨号,联系人列表,联系人详情,和新建联系人。如下所示:
下面是一些其它的由多个Activity组合的Application的例子:
电子邮件 - 查看目录、查看消息列表、查看消息、写消息、配置账号。
日历 - 查看日、周、月、计划,编辑时间,设置属性,提醒
摄像拍照 - 运行照相机,看图片列表,看图,切图,运行摄像机,看视频列表,看视频
游戏 - 游戏本身,以及安装设置
地图 - 查看当前位置,列表(turn list或者好友列表),详细资料(好友位置、状态、照片)
Activity,是组成Application的四种组件中,最重要的一个。另外的组件是, Service,ContentProvider,BroadcaseReceiver。更多关于Activity的细节,请参考 Application组件中的Activity部分。
Activity栈
当用户在Application中,从一个Activity跳到另一个时,Android系统会 保存一个用户访问Activity的线性导航历史。 这就是activity栈,也被称为返回栈。 一般来说,当用户运行一个新的Activity,这个Activity就会被加到Activity栈里。因此,当用户 按BACK键的时候,栈中的上一个Activity就会被展示出来。 用户可以一直按BACK键,直到返回到了主屏。 The adding of an activity to the current stack happens whether or not that activity begins a new task (as long as that task was started without going Home), so going back can let the user go back to activities in previous tasks. 把Activity加入到当前栈里的操作,与Activity是否启动了一个新Task无关。 返回操作可以使用户从当前Task回到上一个Task。 用户可以在应用管理器、主屏、或者“最近Task”屏幕,恢复到刚刚的Task。
只有Activity可以加到Activity栈里去,其它的,包括View、Window、Menu或者Dialog都不行。 这就是说,假设,界面A跳到界面B,然后用户可以用BACK跳回界面A。这种情况下,A和B都要被实现成Activity。 这个规则有一个例外的情况。那就是除非你的应用 控制了BACK键并且自己管理界面导航。
Task
一个Task是用户可以完成一个特定目标的一组Activity。与Activity属于哪个Application无关。 除非明确地新建一个Task,(参考打断Task),用户启动的所有Activity都默认是当前Task的一部分。 需要注意的是,这些Activity可能属于任何一个Application — 属于同一个Application或者属于不同的Application。 这就是说,一个Task可以是,从联系人列表开始,然后选择一个邮箱地址(通过电邮Activity),然后附加一个照片(通过图片Activity)。 联系人列表、电邮、图片,这些都存在于不同的Activity中。
启动Task的Activity被称作根Activity。 通常,Task是从应用管理器、主屏或者最近Task(长按HOME键)开始的。 用户可以通过点击根Activity的图标回到Task里去,就像启动这个Activity一样。 在这个Task中,BACK键可以回到这个Task的前一个Activity里。 Activity栈可以由一个或多个Task组成。
一些关于Task的例子:
发送一个有附件的短信
看YouTube,然后通过Email分享这个视频
打断Task - Task的一个重要的特性就是,用户可以中断他当前正在做的事(他的任务),去进行另一个Task,然后可以返回到原来的那个Task去完成它。 这个特性的意图,就是用户可以同时运行多个任务,并且可以在这些任务间切换。 有两种主要的的方法离开一个Task,这两种情况中,应该让用户能够返回到他们离开的那个任务:
用户被Notification打断 – 来了一个通知,用户开始关注处理这个通知
用户决定开始另一个任务 - 用户按了HOME键,然后开始了另一个Application
当然,规则总是有例外。除了上面提到了两种方法,确实存在第三种方法开始一个新任务,即,在代码中startActivity的时候,定义它要开始一个新Task。 地图和浏览器两个应用就是这么做的。 例如,在电邮中点击一个地址,会在新Task调出地图Activity,在电邮中点击一个链接,会在新的Task中调出浏览器。 在这种情况下,BACK键会回到上一个Activity(另一个Task中的电邮Activity),因为它不是从主屏启动的。
Activity和Task的一个例子
接下来的例子,说明了Application、Activity、Activity栈、BACK键、Task和Intent的基本原理。 它展示了系统响应用户操作的方式,包括启动Activity和在Task之间切换。 你可以在你的Android手机上,按照下面指示的那样,执行这些例子。
从主屏启动一个Activity
主屏是绝大部分Application启动的地方。(某些应用只能从其它应用进入。) 当用户点击应用管理器的一个图标(或者主屏上的一个快捷方式),这个应用的主Activity会被启动到前台,并拥有用户的焦点。 像下面图标展示的那样,用户进入主屏并点击电邮图标的行为,启动了电邮Application的消息列表Activity。 主屏Activity被置到后台,stop。当用户重新进入主屏时,restart。
按着Activity导航,通过BACK键和HOME键离开Activity
一个Activity是否保持它的状态,取决于用户离开它的方式 - 是通过HOME键还是BACK键。
默认情况下,按BACK键会finish(destroy)当前Activity,然后显示上一个Activity给用户。 在下面的图中,用户通过在主屏点击电邮图标启动了显示出电邮消息列表的电邮应用。 用户滚动列表(改变了初始状态)。 点击BACK键
补充:移动开发 , Android ,