原文

http://developer.android.com/guide/practices/ui_guidelines/activity_task_design.html

Activity and Task设计指导

这篇文档主要讲述Android应用框架的核心原则。站在高层来说,以用户为中心来设计良好的交互程序,对于应用设计者或是开发者来说是非常重要的。

下面用例子来阐述了activitiestasks的一些底层原则和机制 ,例如导航,多任务,activity重用,意图和activity栈。这篇文档也着重讨论了一些设计决策,针对如何利用好它们去设计你的应用程序UI

这篇文档中的例子均是Android应用程序,包括默认应用程序(比如拨号器)、Google应用程序(比如地图)。你可以自己在Android模拟器上或是Android手机上去试验这些例子。如果你使用Android手机试验时,可能未提供本文档中的某些例子。

再看这篇文档之前,请确保您看过本篇中的Design Tips章节。此篇算做是Application Fundamentals文档的的一部分(特指Tasks and Back Stack章节),它对于程序员来说覆盖了整个底层机制。

Applications, Activities, Activity Stack and Tasks

理解Android系统中的四个基本概念对你是很有帮助的,它们分别是:

* Applications

* Activities

* Activity Stack

* Tasks

Applications

一个Android应用程序其实就是由一个或者多个Activity组成。它们被捆绑在一起并存放进.apk文件中,这就是Android应用程序。Android中有着丰富的应用程序,比如邮件、日历、地图定位、文本消息、联系人、照相机、打电话、音乐播放器,系统设置等应用。

一般情况下,桌面上都会有Android应用程序快捷图标,用户可以选择某一个图标来启动应用程序。

Activities

ActivityAndroid应用程序的主要组成部分,activity可以是你自己创建的,当然,还可以是其它应用程序中的activity。它们都是在运行时绑定上的,以便于应用程序扩展其自身的功能,它们一旦组合在一起,就会如同一个应用程序一样。每个activity都有其独特的UI、明确的功能,诸如打电话、看照片、听音乐等。任何一个应用程序都应至少有一个activity

当使用Android手机时,用户在屏幕上一个接一个地滑动或是点击图标启动activity,完全不会注意到底层的行为——他们体验是无缝的。activity后面有activitytask后面还会有task

Activity可以处理特定的数据类型和接受一相关的动作。每个activity都有其各自的生命周期,互不干扰;并且它们都可以被用户或者系统独立启动、运行、暂停、恢复运行、停止、重新开始。正因为这个独立性,activity可以以不同的方式被其它的activity进行替换。

比如打电话的应用程序就包含了四个activity:打电话、联系人列表、查看联系人、添加联系人,如下图:

    

打电话 联系人列表 查看联系人 添加联系人

下面的应用程序同样也包含了很多activity

* 邮件 - 查看文件夹、邮件列表、邮件,发送邮件和设置邮件账号。

* 日历 - 查看天、星期、月、议程,编辑事件、首选项。

* 照相机 - 运行照相机、查看图片列表、图片,编辑图片,运行录像机,查看录像列表和录像。

* 游戏 - 玩游戏和安装游戏。

* 地图 - 查看地图上的位置,查看朋友的位置以及他们的详细信息(朋友的位置、状态、照片)。

ActivityAndroid应用中最为突出的组件,其余组件分别为:servicecontent providerbroadcast receiver。更多activities的详情,参见Application Components

Activity Stack

用户之所以能够从一个activity转到下一个activity,是因为Android系统针对activity而设计了一个线性的导航历史以供用户追溯访问,这就是activity栈,也称为back stack。当用户启动了一个新的activity,它就被添加进activity栈,以便按BACK键时能够返回到上一个activity。然而,用户不能按BACK键就直接返回到桌面(除非activity的前一个是桌面才可以)。

activity栈里面存放的只能是activity,而视图、窗体、菜单和对话框则不能。也就是说,如果你可以让用户从屏幕A跳转到屏幕B,当用户按BACK键时,他就应该会回到屏幕A,那屏幕A必须是一个activity。有个例外情况就是,你的应用程序需要利用BACK键控制自身的导航,那就要自己重新设定BACK键的导航功能。

Tasks

任务则是一系列的activity集合,它能使用户完成既定的操作,而又不用去关心这些activity是哪个应用程序里面的,除明确指定一个新任务之外(参见“中断任务”小段),那么其他activity都属于当前任务的一部分。再次注意的是,这些activity可是任意应用程序中的其中一个,也就是说不管它们所属的应用程序是否相同。举个例子,用户打开了联系人的程序,任务随之也会启动,他选择了email地址准备发邮件,这时跳转到了email activity,之后他要添加附件,需要在画廊中挑选图片。这里面,联系人,email,图片画廊都是不同的应用程序。

当一个activity启动时,任务也随之启动的话,那个activity就是根activity。启动activity一般有这么几种方式,应用程序发射器、桌面快捷方式、最近任务切换器。Android系统内部一旦有任务,那么按BACK键就可以回到上一个activityActivity栈可以是多个任务的组成部分。

下面是关于任务的例子,以供参考:

* 发送文本消息并含有附件

* 观看YouTube视频并以邮件的方式向其他人分享。

中断任务 ——任务中有一个重要特性就是能使用户中断当前正在做的操作(他们的任务)而去执行其它操作,当然他们也可以回到之前的任务上,也就是说支持同时运行多任务并且来回切换它们。

这里有两种情况来开始其它任务,并且都可以返回到原先的任务上。

* 打开通知:用户接收到通知并打开查看它。

* 用户转去做其它操作:用户在桌面启动。

当然,也有例外的。除了刚才提到的两种方式,另外还有一种打开新任务的情况,就在其内部开启一个activity。例如,在邮件中以新任务的方式打开地图activity或是打开一个浏览器activity,当按BACK键时就又会回到邮件activity中。

ActivitiesTasks之旅

下面的例子阐述了应用程序的基本原则,主要有activitiesactivity栈,回退键,任务和意图;并展示了系统是如何响应用户请求的,例如用户开始了一个应用程序,用户不断的切换UI,程序内部就是利用在不同任务之间切换activities的。下面的许多例子你都可以在Android手机上运行起来。

在桌面上开始一个Activity

桌面是启动应用程序的主要地方,比如在桌面上点击应用程序图标就能将其打开,用户第一眼看到的就是应用程序中的主activity。如下图,所描述的是用户在桌面点击Email图标所发生的事情:

BACKHOME键进行导航

Activity保持或者丢掉其状态完全取决于用户是怎样离开这个activity——使用HOME键还是BACK键。

默认情况下,按下BACK键来结束(销毁)当前activity并为用户显示上一个activity。例如下图,用户在桌面上打开了邮件,当前activity显示着邮件列表。用户将列表滚动条往下拉以便看到后面的邮件,这时用户按了BACK键,那么Android就会销毁这个邮件信息列表activity并返回之前的activity(桌面)。然后用户又重新打开邮件,还是那个列表,但是滚动条又回到了起始位置上。

上面的例子中,当按下BACK键就返回到了桌面,由于那是用户在上一次看到的activity。不过如果用户从其他activity里面跳转到邮件列表,然后按下BACK键则回到了先前的那个activity(这里只是说明一下BACK键的作用)。

相比之下,下面的图就是用HOME键离开邮件列表activity而不是BACK键,那么当前activity就呈stop状态并移置后台而不是销毁。当再次打开邮件列表activity时状态保持不变。

其它情况:有些应用程序则不是如上面所说的那样。例如联系人和画廊,用户在桌面打开联系人后查看了某个联系人的资料,接着再次打开联系人时,就不会显示之前的activity了。这是因为联系人的主activity有四个标签,是为了让用户能够看到全部的功能特性。

此外,也不是所有activity都是当按下BACK键之后销毁掉的。例如用户开始播放音乐,接着按下BACK键,却不会影响音乐的播放。即使它的activity不再可见,音乐应用程序依然会在状态栏上提示着用户。注意:你也可以让activity不再可见时停止掉或是继续在后台运行,但后者更适合像音乐这样的应用程序。

重用activity

有两个应用程序中,它们分别也有两个activityactivity A activity BA的部分功能需要调用B的已实现功能,那么B就叫被重用。

联系人重用画廊来获取图片 联系人activity中会有联系人的照片,但是照片一般存放在画廊里面,所以联系人要重用画廊的功能来获取图片,画廊activity就是重用的绝佳例子。下面的图画出了重用的流程具体流程是这样的:用户打开了联系人,查看某一个联系人的资料并想编辑他的照片,这时,打开了画廊activity,对图片进行设置并保存,那个联系人的图片也就相应的改变了。

注意画廊最终会返回给联系人一张图片。 下一个例子讲述一个activity的重用并且不返回任何结果。同样需要注意下面的插图是说明通过activity或是activity栈来实现历史导航——用户可以通过每个activity用任何方式回到桌面。

当开始设计一个应用程序时,一个不错的想法就是怎样能够在重用其它应用程序中的activity或是你的activity怎样被其它应用程序重用。如果用一样的intent filter(已经存在了一个activity)再添加一个activity,那么系统会为用户显示出一个选择UI,供用户选择使用那个activity

画廊重用短信来与其他人分享图片分享也是不同应用程序之前重用的好例子。如下图所示,用户打开了画廊,从中挑选了一张图片并点击了共享菜单,选择短信。这时,就打开了短信activity,在其里面写些文字和附加上那张图片之后发送出去。用户现在在短信activity当中,如果想回到画廊activity,就按BACK键返回。

注意这里的短信activity并没有给画廊返回任何的东西。

这些例子都在阐述任务——一系列的activities都在实现同一个目标。每一个例子中的activity都是从两个不同的应用程序中完成本职工作的。

替换activity

这个例子描述的是不用应用程序中的两个activity互相替换,activity A替换activity B。这种一般发生在activity Aactivity B的功能更为强大一些。

换句话来说,AB妥妥得等价,当然就可以实现A替换B。这个例子中的联系人应用程序重用了activityAB虽然是完全不同的activity,但是它们两个彼此形成了互补,使程序更加的强大。

在这里例子中,用户下载了一个手机铃声的activity,称之为“铃声扩展”。用户这时进入到“设置 > 声音&显示 > 手机铃声”里面,系统会展示两个可用activity供用户选择。此时弹出的对话有一个选项是让你设置“是否默认使用此activity”,选中它。当用户选择“铃声扩”时,以后在加载的时候就替换了Android默认铃声的activity了。

多任务

如前所述,当一个activity启动后,用户还可以回到桌面启动第二个activity,第一个activity则不会被销毁还是继续运行着,我们换个例子来说明这一小节——地图应用程序。

* 状态1:用户打开了地图应用程序并查询一个地址。这时,用户该说了,网络太TMD慢了!因为地图定位是需要一些时间的。

* 状态2:用户准备做些其它事情,按下HOME键,不过这样做不会干扰地图应用程序,还是保持其加载地图的状态。

* 状态3:地图activity现在是在后台运行着,桌面在来到了前台。这时用户打开了日历activity,比如查看今天是星期几。

* 状态4:用户回到桌面,重新打开Map,这时地图已经全部加载完毕了。

以上两个应用程序“地图”和“日历”是两个不同的任务,因此Android支持多任务模式。

两个入口点

相对于应用程序来说,必须至少要有一个入口点,也就是至少要有一个activity。桌面上的图标就代表着每个应用程序的入口点,同样也可以在其它应用程序中启动,当然,它们的入口点都在其内部。

而电话应用程序就有两个入口点:联系人和打电话。用户进入到联系人里面选择了一个电话号码并拨打该电话。如下图的图所示,用户打开联系人,也就是启动了联系人的activity,然后选择了一个电话号码随之进入了打电话的activity,最后拨打它。

一旦用户在应用程序里,它们就可以通过标签、菜单项、列表项、屏幕上的按钮或其他用户界面访问诸如新增联系人和编辑联系人。

更多相关文章

  1. Android系统开发
  2. [Network]Android(安卓)N 新wifi connect&auto connect流程分析
  3. 第2.3节 android目录中manifest的介绍
  4. Android用户界面——通用布局对象
  5. Android(安卓)IPC进程间通讯机制学习笔记
  6. android services 使用
  7. Android进阶之数据存储+Preferences
  8. android:allowTaskReparenting(clearTaskOnLaunch...)
  9. 杂乱之android的Spinner应用

随机推荐

  1. android app卸载以后弹出用户反馈界面
  2. Android(安卓)关于佳博和汉印蓝牙热敏打
  3. android解析xml文件的方式之DOM解析
  4. Android(安卓)设备上使得google play sto
  5. Android(安卓)adb无线调试,保护手机USB口,
  6. Android(安卓)使用ListView的A-Z字母排序
  7. Android中的内存泄漏模式
  8. android项目打包
  9. Android(安卓)源码编译加速 使用ccache
  10. 从零开始--系统深入学习android(实践-让我