天天看點

Android開發之旅:應用程式基礎及元件(續)

——成功屬于耐得住寂寞的人,你離成功又近了一步了。

1、激活元件:意圖(Intents)

1.1、活動(Activity)元件的激活

1.2、服務(Service)元件的激活

1.3、廣播接收者(Broadcast receiver)元件的激活

2、關閉元件

3、清單檔案

4、Intent過濾器

當接收到ContentResolver發出的請求後,内容提供者被激活。而其它三種元件——活動、服務和廣播接收者,被一種叫做意圖(intent)的異步消息激活。意圖是一個儲存着消息内容的Intent對象。對于活動和服務來說,Intent對象指明了請求的操作名稱以及作為操作對象的資料的URI和其它一些資訊。例如,它可以傳遞對活動的一個請求,讓它為使用者顯示一張圖檔,或者讓使用者編輯一些文本。而對于廣播接收者而言,Intent對象指明了廣播的行為。例如當照相按鈕被按下,它可以對所有感興趣的對象廣播。

對于每種元件來說,激活的方法是不同的。下面将分别介紹活動、服務、廣播接收者元件的激活方法。

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

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

通過傳遞一個Intent對象至Context.startService()以啟動一個服務(或給予正在運作的服務以一個新的指令)。Android調用服務的onStart()方法并将Intent對象傳遞給它。

與此類似,一個Intent可以傳遞給Context.bindService()以在調用的元件和目标服務之間建立持續的連接配接。這個服務會在調用onBind() 方法中接受這個Intent對象(如果服務尚未啟動,bindService()會先啟動它)。例如,一個活動可以連接配接至前面講到的音樂播放服務,并提供給使用者一個可操作的(使用者界面)以對播放進行控制。這個活動可以調用bindService()來建立連接配接,然後調用服務中定義的對象來控制播放。

應用程式可以通過将Intent對象傳遞給

Context.sendBroadcast()

Context.sendOrderedBroadcast()

Context.sendStickyBroadcast()

及其它類似方法來産生一個廣播。Android會通過onReceive()方法将intent傳遞給所有對此廣播有興趣的廣播接收者。

内容提供者僅在響應ContentResolver提出請求的時候激活。而一個廣播接收者僅在響應廣播資訊的時候激活。是以,沒有必要去顯式的關閉這些元件。

而活動則不同,它提供了使用者界面。與使用者進行會話,是以隻要會話依然持續,哪怕對話程序空閑,它都會一直保持激活狀态。與此相似,服務也會在很長一段時間内保持運作。是以Android提供方法有序地關閉活動和服務。

可以通過調用它的finish()方法來關閉一個活動。一個活動也可以通過調用finishActivity()方法來關閉另外一個活動(它用startActivityForResult() 啟動的)。

服務可以通過調用它的stopSelf()方法來停止,或者調用 Context.stopService()。

當元件不再被使用的時候或者Android必須要為更多活躍的元件回收記憶體時,元件也可能會被系統關閉。

當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類的子類,icon和label屬性指向了包含展示給使用者的此活動的圖示和标簽的資源檔案。

其它元件也以類似的方法聲明——&lt;service&gt; 元素用于聲明服務,&lt;receiver&gt; 元素用于聲明廣播接收者,而&lt;provider&gt;元素用于聲明内容提供者。清單檔案中未進行聲明的活動、服務以及内容提供者将不為系統所見,進而也就不會被運作。然而,廣播接收者既可以在清單檔案中聲明,也可以在代碼中動态的建立(作為<code>BroadcastReceiver</code>對象)且調用Context.registerReceiver()方式注冊到系統。

Intent對象可以顯式地指定目标元件。如果進行了這種指定,Android會找到這個元件(依據清單檔案中的聲明)并激活它。但如果Intent沒有進行顯式的指定,Android就必須為它找到對于intent來說最合适的元件。這個過程是通過比較Intent對象和所有可能對象的intent過濾器完成的。元件的intent過濾器會告知Android它所能處理的intent類型。如同其它關于元件的必要資訊一樣,它們在清單檔案中進行聲明的。這裡是上面示例的一個擴充,其中加入了針對活動的兩個intent過濾器聲明:

              &lt;intent-filter . . . &gt; 

                  &lt;action android:name="android.intent.action.MAIN" /&gt; 

                  &lt;category android:name="android.intent.category.LAUNCHER" /&gt; 

              &lt;/intent-filter&gt; 

                  &lt;action android:name="com.example.project.BOUNCE" /&gt; 

                  &lt;data android:mimeType="image/jpeg" /&gt; 

                  &lt;category android:name="android.intent.category.DEFAULT" /&gt; 

示例中的第一個過濾器——action:“android.intent.action.MAIN”和category:“android.intent.category.LAUNCHER”的組合,是常見的。它标記這個活動顯示在應用程式啟動器中,使用者在裝置上看到的可啟動的應用程式清單。換句話說,這個活動是應用程式的入口,是使用者選擇運作這個應用程式後所見到的第一個活動。第二個過濾器聲明了這個活動針對特定類型的資料。

一個元件可以擁有任意數量的intent過濾器,每個聲明一系列不同的能力。如果它沒有包含任何過濾器,它将隻能被顯式聲明了目标元件名稱的意圖激活。

對于廣播接收者,它在代碼中建立并注冊intent過濾器,直接作為IntentFilter的對象執行個體化。其它過濾器則在清單檔案中設定。

如果您現在對這些概念還沒有完全了解,沒關系這裡我僅是讓大家有個印象,知道這些概念或術語的存在,知道他們大概是做什麼的。後面我還将陸續更詳細地到這些東西并結合一些執行個體,到時候您就會清楚地知道這些東西。

<b>     本文轉自Saylor87 51CTO部落格,原文連結:http://blog.51cto.com/skynet/365389</b><b>,如需轉載請自行聯系原作者</b>

<b></b>

繼續閱讀