Android SDK 1.5中文版 (Application基礎—2)

 

1.1.1 激活組件:Intent

當接收到ContentResolver發出的請求後,內容提供者被激活。而其它三種組件──活動(Activity)、服務和廣播接收器被一種叫做Intent的異步信息所激活。Intent是一個保存着信息內容的Intent對象。對於Activity和服務來說,它指明瞭請求的操作名稱以及作爲操作對象的數據URI和其它一些信息。比如說,它可以爲Activity傳遞一個請求向用戶顯示一張圖片,或者讓用戶編輯一些文本。而對於廣播接收器而言,Intent對象則指明瞭通知的行爲。比如,它可以通知所有感興趣的對象照相按鈕被按下。

激活不同類型的組件的方法是不同的:

  • 傳遞一個Intent對象至Context.startActivity()Activity.startActivityForResult()啓動(或其他假定的新任務)一個Activity。相應的Activity可以通過調用getIntent()方法來查看激活它的Intent對象。Android通過調用ActivityonNewIntent()方法來向Activity傳遞新的Intent
    Activity通常啓動其他的Activity。如果它期望它所啓動的那個Activity返回一個結果,會調用startActivityForResult()來取代startActivity()。比如說,如果啓動了另外一個Activity以使用戶挑選一張照片,它應該希望返回被選中的照片。結果將會被封裝在一個Intent對象中,並傳遞給啓動ActivityonActivityResult()方法。
  • 通過傳遞一個Intent對象至Context.startService()將啓動一個服務(或給予正在運行的服務一個新的指令)。Android調用服務的onStart()方法並將Intent對象傳遞給它。
    與此類似,Intent可以被組件傳遞給Context.bindService()以建立與一個正在運行的目標服務的連接。服務通過其onBind()方法獲取這個Intent對象(如果服務尚未啓動,bindService()會先啓動它)。比如,一個Activity可以連接至上述的音樂回放服務,並提供給用戶一個可操作的(用戶界面)以對回放進行控制。這個Activity可以調用bindService()來建立連接,然後調用服務定義的對象來控制回放。後面一節:遠程方法調用將更詳細的闡明如何綁定至服務。
  • 應用程序可以將Intent對象傳遞給Context.sendBroadcast()Context.sendOrderedBroadcast()Context.sendStickyBroadcast()方法、以及他們的任何變種形式來產生一個廣播。Android會調用所有對此廣播有興趣的廣播接收器的onReceive()方法,並將Intent傳遞給它們。

欲瞭解更多Intent消息的信息,請參閱章節IntentIntent Filter(濾過器)。

1.1.2 關閉組件

內容提供者僅在響應來自ContentResolver的請求時激活。而廣播接收器僅在響應廣播消息的時候激活。所以,沒有必要顯式的關閉這些組件。

Activity則不同,它提供了用戶界面。並與用戶進行會話。所以只要會話依然持續,哪怕會話過程暫時停頓,它都會一直保持激活狀態。與此相似,服務也會在很長一段時間內保持運行。所以Android爲關閉Activity和服務提供了一系列的方法。

  • 可以通過finish()方法來關閉一個ActivityActivity可以通過調用另外一個Activity(它通過startActivityForResult()啓動)的finishActivity()方法來關閉它。
  • 服務可以通過調用它的stopSelf()方法來停止,或者調用Context.stopService()

系統也會在組件不再被使用的時候或者Android需要爲活動組件提供更多內存的時候關閉它。後面組件的生命週期一節,將對這種情況進行更詳細的討論。

1.1.3 manifest文件

Android啓動一個應用程序組件之前,它必須知道那個組件是存在的。所以,應用程序會在一個manifest文件中聲明它的組件,這個文件被打包到Android包中。這個.apk文件還將包括應用程序的代碼、文件以及其它資源。

這個manifest文件以XML作爲結構格式,所有Android應用程序都叫AndroidManifest.xml。除了聲明應用程序組件, 它還提供很多額外功能,比如指明應用程序所需鏈接的庫名稱(除了默認的Android庫之外)以及聲明應用程序期望獲得的各種權限。

manifest文件的主要功能仍然是向Android聲明應用程序的組件。例如,Activity可以這樣聲明:

<?xml version=”1.0” encoding=”utf-8”?>

<manifest . . . >

    <application . . . >

        <activity android:name=”com.example.project.FreneticActivity”

                  android:icon=”@drawable/small_pic.png”

                  android:label=”@string/freneticLabel”

                  . . .  >

        </activity>

        . . .

    </application>

</manifest>

<activity>元素的name屬性指定了實現了這個Activity Activity子類。Iconlabel屬性指向了展示給用戶的此Activity的圖標和標籤資源文件。

其它組件也以類似的方法聲明——<service>元素用於聲明服務,<receiver>元素用於聲明廣播接收器,而<provider>元素用於聲明內容提供者。Manifest文件中未進行聲明的Activity、服務以及內容提供者將不爲系統所見,從而也就不會被運行。然而,廣播接收器既可以在manifest文件中聲明,也可以在代碼中進行動態的創建,並以調用Context.registerReceiver()方式註冊至系統。

欲更多瞭解如何爲應用程序構建manifest文件,請參閱AndroidManifest.xml文件一節。

1.1.4 Intent Filter(過濾器)

Intent對象可以顯式指定目標組件。如果指定目標組件,Android會找到這個組件(根據manifest文件中的聲明)並激活它。但如果Intent沒有指定目標組件,Android就必須找到最合適的組件來響應Intent。這個過程是通過比較Intent對象和所有潛在目標對象的Intent Filter實現。組件的Intent Filter會通知Android它所能處理的Intent類型。和組件的其他重要信息一樣,Intent Filter也是在manifest文件聲明。下面是上面示例的一個擴展,向Activity添加了兩個Intent Filter聲明:

<?xml version=”1.0” encoding=”utf-8”?>

<manifest . . . >

<application . . . >

        <activity android:name=”com.example.project.FreneticActivity”

                  android:icon=”@drawable/small_pic.png”

                  android:label=”@string/freneticLabel”

                  . . .  >

            <intent-filter . . . >

                <action android:name=”android.intent.action.MAIN” />

                <category android:name=”android.intent.category.LAUNCHER” />

            </intent-filter>

            <intent-filter . . . >

                <action android:name=”com.example.project.BOUNCE” />

                <data android:type=”image/jpeg” />

                <category android:name=”android.intent.category.DEFAULT” />

            </intent-filter>

        </activity>

        . . .

</application>

</manifest>

示例中的第一個過濾器——行爲“android.intent.action.MAIN”和類別“android.intent.category.LAUNCHER”的組合最常見的。它標明這個Activity將在應用程序啓動項中顯示,即用戶在設備上看到的可以啓動的應用程序列表。換句話說,這個Activity是應用程序的入口,是用戶選擇該應用程序後所看到的第一個Activity

第二個過濾器聲明瞭這個Activity可以在特定類型的數據上執行的操作。

組件可以有任意數量的Intent Filter,每個聲明一系列不同的功能。如果沒有任何過濾器,則只能被顯式聲明瞭目標組件名稱的Intent激活。

對於在代碼中創建並註冊的廣播接收器,Intent Filter直接實例化爲IntentFilter對象。所有其它的過濾器都在manifest文件設定。

關於Intent Filter的其他信息,請參閱:IntentIntent Filter

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章