Android应用程序组件(五)

来源:互联网 发布:java tar打包代码 编辑:程序博客网 时间:2024/06/02 13:11

活动是一个提供单幕的应用程序组件。用户通过与该单幕进行交互完成一些事情,例如打电话、拍照片、发电子邮件或查地图等。每个活动都有一个绘制它的用户界面的窗口。通常窗口填满整个屏幕,但是它也可以比窗口小或者浮动在其他窗口上方。

应用程序通常由多个活动组成,但是这些活动彼此紧密联系。一般地,应用程序中有一个活动会被指定为“main”活动,它是当应用程序第一次启动时呈现给用户的活动。然后每个活动可以启动另外一个活动去执行不同的动作。每当一个活动开始的时候,之前的活动就会停止,但是系统将把该活动保存在一个栈中(称作后台栈)。当一个活动开始时,它会被推入后台栈并且获得用户焦点。后台栈遵守基本的“后进先出”的栈规则,因此当用户完成当前活动点击“后退”按钮时,该活动会从栈中弹出(被销毁)并且之前的活动会恢复。

当活动因为一个新的活动的开始而被停止时,它通过活动的生命周期回调方法获得状态改变的通知。无论系统是在创建它、停止它、恢复它或者是销毁它,一个活动都可能根据状态的变化接收几次回调。并且每一次回调给你提供了执行适合于该次状态改变的特定任务的机会。例如,当活动被停止时,活动应该释放任何大对象例如网络、数据库链接等。当活动恢复时,可以重新获取这些必要的资源并且恢复被打断的动作。这些状态转换都是活动生命周期的一部分。

本文档的剩下部分讨论构建和使用活动的基本知识,包括对活动的生命周期如何工作的完整讨论,这样你就可以以适当的方式管理多个活动状态的改变。

创建活动

为了创建活动,你必须创建Activity(或者它的已存在子类)的一个子类。在你的子类中,需要实现它在其生命周期中的各个状态间转换时系统会调用的回调方法,例如当活动被创建、停止、恢复或销毁。其中最重要的两个回调函数是:

  • onCreate()。你必须实现这个方法。系统在创建你的活动时调用这个方法。在你的实现中,你应该实例化活动中重要的组件。更重要的是,这是你必须调用setContentView()来定义活动的用户界面的地方。
    -onPause()。当用户正准备离开你的活动时系统调用这个方法(尽管它并不总是意味着活动会被销毁)。这个函数是你应该提交任何必须保持的改变的地方,而不管当前用户的对话(因为用户可能不会在回来)。

为了提供一个在活动之间切换的流畅的用户体验,还有其他几个生命周期回调方法来处理导致你的活动停止甚至被销毁的无法预料的干扰。

实现用户界面

活动的用户界面通过一层视图来提供,视图是继承自View的类。每个视图控制一个活动窗口中的一个特殊的矩形区域,可以响应用户交互。例如,按钮是一个视图,当用户点击它时它初始化一个动作。

Android系统提供了大量可用的视图,可以用它们来设计和组织你的布局。小工具(Widgets)是为屏幕提供可视的(可交互)的元素例如按钮、文本、判断框或者只是一个图片。布局是继承自ViewGroup的视图,它为它的子视图提供了一个独特的布局模式,例如线性布局、网格布局或相对布局等。你也可以直接创建继承自 ViewViewGroup类的子类来创建你自己的小工具和布局,并把它们应用到你的活动布局中。

定义布局最普遍的方式是使用保存在应用程序资源中的XML布局文件。以这种方式,你可以维持用户界面和定义活动的源代码分离。你可以通过向setContentView()方法传入这个布局的资源ID来设置该布局为活动的界面。然而,你也可以在代码中创建新的视图,并通过将视图插入ViewGroup来构建视图层次,然后通过将视图层次中的根元素传入setContentView()使用这个布局。

在清单文件中声明活动

为了让活动可以被系统访问,必须在清单文件中声明该活动。为了声明该活动,打开清单文件并添加一个<activity>元素作为<application>的子元素。例如:

<manifest ... >  <application ... >      <activity android:name=".ExampleActivity" />      ...  </application ... >  ...</manifest >

还有几个其他属性可以包括在<activity>元素中,来定义活动的属性例如活动的标签、活动的图标或者定制活动UI的样式的主题等。android:name属性是唯一需要的属性,它指定了活动的类名。一旦你发布了你的应用程序,你应该不要改变它的名字,因为如果你这么做了,你可能会破坏某些功能,例如应用程序快捷方式。

使用意图过滤器

为了声明其他应用程序如何启动该活动, <activity>元素也可以使用<intent-filter>元素指定多个意图过滤器。

当你使用Android SDK工具创建一个新的应用程序时,创建的默认活动自动包括一个意图过滤器,它声明了“main”动作,并且应该被放在“launcher”类别中,意图过滤器如下所示:

<activity android:name=".ExampleActivity" android:icon="@drawable/app_icon">    <intent-filter>        <action android:name="android.intent.action.MAIN" />        <category android:name="android.intent.category.LAUNCHER" />    </intent-filter></activity>

上例中,<activity>元素指定这是应用程序的主入口点。<category>元素指定这个活动应该被放置在系统的应用程序启动器中(允许用户启动该活动)。

如果你想要你的应用程序是封闭的,不允许其他应用程序启动它的活动的话,你就不需要其他任何意图过滤器。像上面的例子一样,只有一个活动可以包含“main”动作和“launcher”类别。你不想让其他应用程序使用的活动不应该具有意图过滤器,但你可以使用显式意图来启动它们。

然而,如果你想要你的活动响应从你自己或其他应用程序中传递来的隐式意图,那么你必须为活动定义另外的意图过滤器。为你想要响应的每一个意图包括一个包含一个<action>元素的<intent-fiter>元素,还可以为起添加可选的<category>元素或者<data>元素。这些元素指定了你的活动可以响应的意图的类型。

原文

http://wear.techbrood.com/guide/components/activities.html#

0 0
原创粉丝点击