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

Vamei發表於2014-08-07

作者: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快速教程”系列文章

相關文章