当前位置: 首页 > 文档资料 > Java 快速教程 >

安卓第四夜 概念漫游(下)

优质
小牛编辑
126浏览
2023-12-01

在安卓第三夜 概念漫游(上)中,我介绍了安卓最基本的功能单元和Intent的连接方式。在这个骨架之上,我们可以进一步增加一些与开发密切相关的重要概念。

Context

一个应用是由多个Activity和Service这样的功能单元组成。一个应用共享有一个Application Context对象。在功能单元内部,可以用特定的方法来调用该对象。正如名字所表示的,Context对象记录了应用所处的环境。如同新生儿的功能单元,可以通过查询Context对象,了解当前的周边状况,比如屏幕的尺寸。这个Context对象还中包含了许多应用级别的功能,比如加载应用资源。一个Context对象与对应应用共存。它在应用运行之初即创立,直到应用结束运行。整个过程中,应用的功能单元就好像共同沐浴在Application Context这个温水池中,随时享受着沐浴带来的舒适。

Context

除了一个应用中唯一的Application Context对象,应用运行过程中还可能创建其他的Context对象。Activity类和Service类都继承自Context类,所以Activity对象和Service对象也都是Context对象,我把它们称为Activity Context和Service Context。这两种Context对象与对应的Activity对象和Service对象有相同的生命周期。它们为内部的对象,提供了周边信息和功能。比如在创建一个UI元素View的时候,就需要把Activity Context对象作为参数传给该View。在Activity结束时,对应的Activity Context对象也会销毁。在Activity和Service内部,可以通过this来调用对应的Activity Context和Service Context对象。Activity Context对象提供了启动一个新的Activity的功能,而Service Context对象则没有UI相关的功能。

不同类型的Context对象在功能上有许多重叠的地方,比如都可以启动一个Service。但要注意它们生命周期的不同。Application Context对象有最长的生命周期。过度依赖Application Context对象,可能导致内存泄露。所以,原则上要尽可能的使用Activity Context和Service Context对象来实现Context类的功能。

Life Cycles

View

Activity是一个屏幕界面。界面上总是有各种各样的视图元素,比如一个按钮,一行文字和一个输入栏。每一种视图元素在安卓中表示为一个View类,比如Button类,TextView类和EditText类。安卓的视图元素很多样,就连图片和网页也都有对应的视图元素。除了具体的视图元素,View类还有一个ViewGroup的子类。多个View对象可以归属于一个ViewGroup对象,而ViewGroup对象往往定义了下属视图元素的布局关系,比如自上而下线性排列,或者格点式排列。通过这样的归属关系,一个Activity的所有视图元素和抽象布局构成一个视图树。这棵树就包含了整个屏幕的视图信息。

视图树

在安卓设计中,我们往往要给View元素增加各种属性,以控制它们的文字、尺寸、大小、颜色等信息。对于ViewGroup来说,它有多个子类,代表了不同的布局方式。比较常见的有线性布局LinearLayout和相对布局RelativeLayout。线性布局是沿着一个方向线性排列视图元素,而相对布局则定义了视图元素和母View对象或兄弟View对象的相对位置关系。通过嵌套使用多种布局,我们可以创造出复杂的界面布局方式。

在一个Activity中,我们可以通过新建View对象的方式,用编程的手段来创建视图树。视图元素的属性可以通过View对象的方法来调整。但更常用的方法是定义一个XML文件。利用XML天然的树形结构来表示一个视图树。一个XML节点对应一个View对象,View对象的属性可以记录在节点的属性中。 安卓可以理解这样的XML定义,并把XML节点实例化为内存中的对象,也就是Layout Inflate的过程。比如下面的XML记录:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
              android:layout_width="match_parent"
              android:layout_height="match_parent"
              android:orientation="vertical" >
    <TextView android:id="@+id/text"
              android:layout_width="wrap_content"
              android:layout_height="wrap_content"
              android:text="Hello, I am a TextView" />
    <Button android:id="@+id/button"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Hello, I am a Button" />
</LinearLayout>

它表示了一个线性布局,包含了一个文字视图和一个按钮。

从3.0之后,安卓引入了Fragment。Fragment与Activity一样,包含了一个视图树。由于一个Activity可以包含多个Fragment,也就是多个视图树,这就增加了界面设计的灵活性。毕竟,在Fragment以前,Activity只能包含一个视图树,比较死板。有了Fragment之后,程序员可以根据Activity的当前状况,来选择所包含的视图树,比如在手机屏幕显示一个Fragment,而在平板上显示两个Fragment。这样,视图的设计也可以重复利用不用不同的设备了。

Fragment的运行方式与Activity类似,也是在状态转换中调用onStart()等方法。

Resource

在安卓开发中,有可能需要一些静态资源,比如图片、字符串、XML文件等等。这些资源被存储在安卓项目res/下不同的文件夹中。

不同资源分类存放。我们上面提到用XML来定义布局,它们就保存在layout下。drawable*的文件夹中包含不同清晰度的图片,而字符串存放在values下的strings.xml中。在安卓项目中,我们可以用ID或文件名,来引用对应的资源。

总结

Context: 环境信息和功能

View: 视图

Resource: 静态资源