文章出處

作者:Vamei 出處:http://www.cnblogs.com/vamei 歡迎轉載,也請保留這段聲明。謝謝!

 

安卓第三夜 概念漫游(上)中,我介紹了安卓最基本的功能單元和Intent的連接方式。在這個骨架之上,我們可以進一步增加一些與開發密切相關的重要概念。

 

Context

一個應用是由多個Activity和Service這樣的功能單元組成。一個應用共享有一個Application Context對象。在功能單元內部,可以用特定的方法來調用該對象。正如名字所表示的,Context對象記錄了應用所處的環境。如同新生兒的功能單元,可以通過查詢Context對象,了解當前的周邊狀況,比如屏幕的尺寸。這個Context對象還中包含了許多應用級別的功能,比如加載應用資源。一個Context對象與對應應用共存。它在應用運行之初即創立,直到應用結束運行。整個過程中,應用的功能單元就好像共同沐浴在Application Context這個溫水池中,隨時享受著沐浴帶來的舒適。

Context

 

除了一個應用中唯一的Application Context對象,應用運行過程中還可能創建其他的Context對象。Activity類和Service類都繼承自Context類,所以Activity對象和Service對象也都是Context對象,我把它們稱為Activity ContextService 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: 靜態資源

 

歡迎繼續閱讀“Java快速教程”系列文章


文章列表


不含病毒。www.avast.com
arrow
arrow
    全站熱搜
    創作者介紹
    創作者 大師兄 的頭像
    大師兄

    IT工程師數位筆記本

    大師兄 發表在 痞客邦 留言(0) 人氣()