2011年10月11日 星期二

Intent (1) - Android 新手學習筆記

在 Android Application 中,activities, services, and broadcast receivers 這三個核心元件
是透過一種"訊息"來啟動的,這個"訊息",在 Android 中,叫做 Intent (意圖)
它內含了想要做的動作資訊
透過 Intent,資訊可以在不同的元件中傳遞,就算是不同應用程式也可以



不同的元件型態,各有不同的方法來傳遞 Intent

* Activity
 Intent 可以在呼叫 Context.startActivity()
 或 Activity.startActivityForResult() 時,做為參數傳入
 如此即可啟動另一個 Activity 或讓一個已存在的 Activity 做些新的事情
 在用 Activity.startActivityForResult() 來啟動 Activity 時
 是想要被啟動的那個 Acitivity 能回傳一些資訊
 所以在被啟動的那個 Acitivity,可以呼叫 Activity.setResult()
 並傳入一個包含想回傳的資訊的 Intent 來傳回給原先的那個 Activity
 在原先的那個 Activity 可以在 Activity.onActivityResult() 接收到回傳的 Intent

* Service
 Intent 可以在呼叫 Context.startService() 時,做為參數傳入
 如此即可初始化一個 Service 或讓一個已在運作中的 Service 做些新的事情
 也可用在 Context.bindService(),用來在 Service 與呼叫的元件之間建立連線

* Broadcast
 Intent 可以用在任何的廣播 method,例如
 Context.sendBroadcast(),Context.sendOrderedBroadcast(), Context.sendStickyBroadcast()
 如此,能處理此 Intent 的 Broadcast receivers 就可以收得到這個訊息

在上述的每個情況中
Android 系統會自動找到適合的 Activity 或 Service 或 Broadcast receiver 來回應該 Intent
且使用 Activity 方法時,不會去找 Service 或 Broadcast receiver 來回應
使用其他方法時也同理

下文就是在講述系統如何找到適合的元件

========

Intent 可以包含下面的資訊

* Component name
可以透過下面的任一個 method 直接指定處理此 Intent 的元件
setComponent()
setClass()
setClassName()
這些 method 的相關參數雖然都有分 pkg 及 cls
但 cls 似乎是要寫完整的名稱,即包含 package 的名稱
而 pkg 則是寫在 manifest 中所設定的套件名稱
此處 cls 所在的 package 不一定等於(可以不等於) pkg

* Action
若不指明 Component name
也可以透過 setAction() 利用 action 字串來表明這個 intent 想要的動作
Intent 類別已有定義了數個標準的 action 名稱
action 字串也可自訂,但應該要包含 package 名在內,以免重複
透過 action 名稱(及其他資訊),Android 底層就會自動找出可以處理此動作的元件來執行
若有多個時,會讓使用者選擇

* Data
同樣的 action 名,但給不同的資料(URI and MIME type)時,能處理的元件也會不同
可以透過下面的 method 來指定
setData()
setType()
setDataAndType()

* Category
元件的分類,也就是可以指定哪些類別的元件可以來處理這個 Intent
可以透過 addCategory() 來指定

* Extras
額外的資訊,資料型態是 android.os.Bundle
它是一個類似 java.util.Map 的資料結構
有些 Action 需要一些額外的資訊
可以透過 putExtras() 來指定

* Flags
 應該是跟執行的順序有關,詳細用法還不清楚
Flags of various sorts. Many instruct the Android system how to launch an activity (for example, which task the activity should belong to) and how to treat it after it's launched (for example, whether it belongs in the list of recent activities). All these flags are defined in the Intent class.

上面的 Component name 與 action 是擇一使用的
當直接指定 Component name 時,此種 Intent 稱為 Explicit Intent (明確的意圖)
而若是用 action 時,此種 Intent 稱為 Implicit Intent (不言明的意圖)
也就是丟出這個 Intent 的元件,也不知道會由哪一個元件來接收處理此 Intent

Intent (2) - Android 新手學習筆記
Intent (3) - Android 新手學習筆記

沒有留言:

張貼留言

廣告訊息會被我刪除