Android開發之旅5:應用程序基礎及組件

引言

上篇Android開發之旅:應用程序基礎及組件介紹了應用程序的基礎知識及Android的四個組件,本篇將介紹如何激活組關閉組件等。本文的主題以下:html

  • 一、激活組件:意圖(Intents)
    • 1.一、活動(Activity)組件的激活
    • 1.二、服務(Service)組件的激活
    • 1.三、廣播接收者(Broadcast receiver)組件的激活
  • 二、關閉組件
  • 三、清單文件
  • 四、Intent過濾器

一、激活組件:意圖(Intents)

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

對於每種組件來講,激活的方法是不一樣的。下面將分別介紹活動、服務、廣播接收者組件的激活方法。app

1.一、活動(Activity)組件的激活

經過傳遞一個Intent對象至Context.startActivity()Activity.startActivityForResult()以載入(或指定新工做給)一個活動。相應的活動能夠看到初始的意圖,這個意圖經過getIntent() 方法來查看激活活動。Android調用活動的onNewIntent()方法傳遞任何後續的意圖。異步

一個活動常常啓動了下一個。若是它指望它所啓動的那個活動返回一個結果,它會調用startActivityForResult()而不是startActivity()。例如,若是它啓動了一個活動讓用戶挑選一張照片,它可能會返回被選中的照片。結果以一個Intent對象傳遞調用活動的onActivityResult() 方法。ide

1.二、服務(Service)組件的激活

經過傳遞一個Intent對象至Context.startService()以啓動一個服務(或給予正在運行的服務以一個新的指令)。Android調用服務的onStart()方法並將Intent對象傳遞給它。post

與此相似,一個Intent能夠傳遞給Context.bindService()以在調用的組件和目標服務之間創建持續的鏈接。這個服務會在調用onBind() 方法中接受這個Intent對象(若是服務還沒有啓動,bindService()會先啓動它)。例如,一個活動能夠鏈接至前面講到的音樂播放服務,並提供給用戶一個可操做的(用戶界面)以對播放進行控制。這個活動能夠調用bindService()來創建鏈接,而後調用服務中定義的對象來控制播放。spa

1.三、廣播接收者(Broadcast receiver)組件的激活

應用程序能夠經過將Intent對象傳遞給code

  • Context.sendBroadcast()
  • Context.sendOrderedBroadcast()
  • Context.sendStickyBroadcast()

及其它相似方法來產生一個廣播。Android會經過onReceive()方法將intent傳遞給全部對此廣播有興趣的廣播接收者。xml

二、關閉組件

內容提供者僅在響應ContentResolver提出請求的時候激活。而一個廣播接收者僅在響應廣播信息的時候激活。因此,沒有必要去顯式的關閉這些組件。htm

而活動則不一樣,它提供了用戶界面。與用戶進行會話,因此只要會話依然持續,哪怕對話進程空閒,它都會一直保持激活狀態。與此類似,服務也會在很長一段時間內保持運行。因此Android提供方法有序地關閉活動和服務。

  • 能夠經過調用它的finish()方法來關閉一個活動。一個活動也能夠經過調用finishActivity()方法來關閉另一個活動(它用startActivityForResult() 啓動的)。
  • 服務能夠經過調用它的stopSelf()方法來中止,或者調用 Context.stopService()

當組件再也不被使用的時候或者Android必需要爲更多活躍的組件回收內存時,組件也可能會被系統關閉。

三、清單(manifest)文件

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

這個清單文件是XML結構的文件,且全部的Android應用程序都把它叫作AndroidManifest.xml。爲聲明一個應用程序組件,它還會作不少額外工做,好比指明應用程序所需連接到的庫的名稱(除了默認的Android庫以外)以及聲明應用程序指望得到的各類權限。

但清單文件的主要功能仍然是向Android聲明應用程序的組件。舉例說明,一個活動能夠以下聲明:

<?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類的子類,iconlabel屬性指向了包含展現給用戶的此活動的圖標和標籤的資源文件。

其它組件也以相似的方法聲明——<service> 元素用於聲明服務,<receiver> 元素用於聲明廣播接收者,而<provider>元素用於聲明內容提供者。清單文件中未進行聲明的活動、服務以及內容提供者將不爲系統所見,從而也就不會被運行。然而,廣播接收者既能夠在清單文件中聲明,也能夠在代碼中動態的建立(做爲BroadcastReceiver對象)且調用Context.registerReceiver()方式註冊到系統。

四、Intent過濾器

Intent對象能夠顯式地指定目標組件。若是進行了這種指定,Android會找到這個組件(依據清單文件中的聲明)並激活它。但若是Intent沒有進行顯式的指定,Android就必須爲它找到對於intent來講最合適的組件。這個過程是經過比較Intent對象和全部可能對象的intent過濾器完成的。組件的intent過濾器會告知Android它所能處理的intent類型。如同其它關於組件的必要信息同樣,它們在清單文件中進行聲明的。這裏是上面示例的一個擴展,其中加入了針對活動的兩個intent過濾器聲明:

<?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:mimeType="image/jpeg" />
                  <category android:name="android.intent.category.DEFAULT" />
              </intent-filter>
         </activity>
          . . . 
     </application>
</manifest>

示例中的第一個過濾器——action:「android.intent.action.MAIN」和category:「android.intent.category.LAUNCHER」的組合,是常見的。它標記這個活動顯示在應用程序啓動器中,用戶在設備上看到的可啓動的應用程序列表。換句話說,這個活動是應用程序的入口,是用戶選擇運行這個應用程序後所見到的第一個活動。第二個過濾器聲明瞭這個活動針對特定類型的數據。

一個組件能夠擁有任意數量的intent過濾器,每一個聲明一系列不一樣的能力。若是它沒有包含任何過濾器,它將只能被顯式聲明瞭目標組件名稱的意圖激活。

對於廣播接收者,它在代碼中建立並註冊intent過濾器,直接做爲IntentFilter的對象實例化。其它過濾器則在清單文件中設置。

 

若是您如今對這些概念尚未徹底理解,不要緊這裏我僅是讓你們有個印象,知道這些概念或術語的存在,知道他們大概是作什麼的。後面我還將陸續更詳細地到這些東西並結合一些實例,到時候您就會清楚地知道這些東西。

 

 

做者:吳秦出處:http://www.cnblogs.com/skynet/

相關文章
相關標籤/搜索