Android活动既是用户交互单元(通常填满Android移动设备的整个屏幕)也是执行单元。开发交互式的Android程序时,首先要继承Activity类。Activity类提供了在Android应用中可重用、可交换的UI组件流。
那么,一个活动如何调用另一个活动,如何将信息传递给第二个活动呢?不同活动之间的基本通信单元是Intent类。Intent类是一个抽象的功能描述,用来定义一个活动要求另一个活动执行的功能,类似于是第二个活动提供的功能的一张照片。Intent类是构建松散耦合的系统的基础,它支持一个活动启动另一个活动,并提供结果应用发布Intent时,可能已经有几个不同的已注册的活动都能实现这个功能。
在其中一个抽象层,Android应用看起来和Web应用很相似。活动类似于Web应用中的servlet。设计良好的活动负责管理单个UI页面,每个UI都有自己唯一的名称。用户根据这些链接,从Web页面的一个页面跳转到另一个页面,而在Android应用中,用户交互是通过intent调用的。新页面可以通过链接导航到老页面。正如在Web应用世界中,有些servlet提供UI功能,其他的提供服务的API。因此,在Android世界中,活动提供UI,而Service和ContentProvider类(很快会介绍)提供对这些服务的访问功能。理解这种架构上的相似性有助于充分有效利用Android框架设计Android应用。
在本书第1章中为验证Android SDK是否正确安装而创建test应用的过程中,我们已经“编写”过了和活动相关的代码。下面再一起来看看这段代码:
public class TestActivity extends Activity { /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); }}
当系统启动这个活动时,它会首先调用Activity的子类TestActivity的构造函数,然后调用Activity的onCreate方法。这会加载并显示在main.xml文件中定义的视图结构(view hierarchy)。onCreate方法则开启了Activity的生命周期,这在第10章会详细说明。
Activity类是Android系统中最重要的类之一,支持应用的模块化及功能共享。Activity会和Android运行时交互,以实现应用生命周期的关键部分。每个activity可以使用类Context独立配置。
注意:和用object来表示类的实例很相似,我们使用活动来表示类Activity的实例。
在绝大多数情况下,一个Android应用中的每个活动都独立于其他的活动。一个活动不会在代码中直接调用另一个活动的方法。Android框架中的另外一个元素(Intent)负责通信。因此,不建议引用活动对象。Android运行时环境负责创建并管理应用的activity及其他各种组件,回收它们所使用的内存,以确保每个任务占用的内存相对较少。你会发现专门对activity内存进行管理时,效率反而会非常低下。
警告:Android编程新手往往会禁止Android组件生命周期运行程序的Activity实例。实际上,尝试通过引用Activity对象即时控制Android内存管理的方式是没有意义的,而且会影响性能。
在Android中的用户界面流控制,不是基于方法调用的。在其所采用的机制中,应用使用Intent描述清楚它想要的功能,系统负责找出一个匹配的实现。Android的Home桌面就是使用这些描述来启动应用的,每个应用也可以按照自己的意愿使用自己喜欢的intent来实现这种桌面功能。Android开发人员将这种结果流称为“任务”(task):跨越多个应用的一组activity,而且实际上是多个进程。图3-3显示了跨越三个应用并涉及了多个活动的一个任务(表3-1给出的例子)。组成该任务的活动链跨越了三个独立的进程和堆,它们可以相互独立存在,其他应用也可能会为同一个Activity子类另外创建实例。
表3-1:一个简单的任务实例,由多个应用的activity组成
图3-3:一个任务中跨越了多个应用的多个活动