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

來源:互聯網
上載者:User

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

引言

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

  • 1、啟用組件:意圖(Intents)
    • 1.1、活動(Activity)組件的啟用
    • 1.2、服務(Service)組件的啟用
    • 1.3、廣播接收者(Broadcast receiver)組件的啟用
  • 2、關閉組件
  • 3、資訊清單檔
  • 4、Intent過濾器
1、啟用組件:意圖(Intents)

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

對於每種組件來說,啟用的方法是不同的。下面將分別介紹活動、服務、廣播接收者組件的啟用方法。

1.1、活動(Activity)組件的啟用

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

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

1.2、服務(Service)組件的啟用

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

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

1.3、廣播接收者(Broadcast receiver)組件的啟用

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

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

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

2、關閉組件

內容提供者僅在響應ContentResolver提出請求的時候啟用。而一個廣播接收者僅在響應廣播資訊的時候啟用。所以,沒有必要去顯式的關閉這些組件。

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

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

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

3、清單(manifest)檔案

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

這個資訊清單檔是XML結構的檔案,且所有的Android應用程式都把它叫做AndroidManifest.xml。為聲明一個應用程式組件,它還會做很多額外工作,比如指明應用程式所需連結到的庫的名稱(除了預設的Android庫之外)以及聲明應用程式期望獲得的各種許可權。

但資訊清單檔的主要功能仍然是向Android聲明應用程式的組件。舉例說明,一個活動可以如下聲明:

AndroidManifest.xmlxml 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>

元素的name屬性指定了實現了這個活動的Activity類的子類,icon和label屬性指向了包含展示給使用者的此活動的表徵圖和標籤的資源檔。

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

4、Intent過濾器

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

AndroidManifest.xmlxml 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的對象執行個體化。其它過濾器則在資訊清單檔中設定。

 

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

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.