2010年10月20日 星期三

Android Intent物件

一.說明
在Android內三個核心元件activities, services, and broadcast receivers,都是靠Intents傳遞訊息來啟動

1.啟動Activity
透過將intent放到 Context.startActivity(intent) 或 Activity.startActivityForResult(intent)內來啟動Activity,或取得一個已存在的Activity去執行。另外可透過Activity.setResult(resultCode,intent)取得由呼叫Activity.startActivityForResult()所回傳的資訊

2.啟動Service
透過放intent到Context.startService(intent),去初始化啟動一個Service,亦可將intent傳給Context.bindService(intent),建立元件與service的連線。

3.發布給Broadcast Receivers
將intent物件傳給任何broadcast methods,可以發布給所有有興趣的broadcast receivers,例如Context.sendBroadcast(), Context.sendOrderedBroadcast(), or Context.sendStickyBroadcast()

當有intent被發出時(以上3種方式),Android會找到適合的物件回應這intent,也就是說屬於broadcast的不會去處發到service,而透過startActivity()傳遞的intent只會被Activity接收到

二.Intent Object
intent物件是一個資訊包,他包括了要接收到這intent的元件所會有興趣的資料,如要執行哪些動作,要用到哪些資料
與Android系統所會有興趣的資料,如哪些類別的元件要來接收這intent,與要如何去啟動目標的Activity
一個Intent物件包含以下資訊

1.Component name:ComponentName Class,非必填
指定需要去處理這個intent的Component,這欄位資料為ComponentName 類別,包括這元件的完整class名稱(如com.oz.)與註冊在manifest內的Applcation package name,可利用 setComponent(), setClass(), or setClassName()寫入,用getComponent()讀取

ComponentName cn=intent.getComponent();
cn.getClassName()

2.Action:String,非必填
指定這intent要執行的動作,在Intent Class內已經定義好幾個const代表要執行的動作

ACTION_CALL:初始化phone call
ACTION_EDIT:顯示資料讓使用者編輯
可透過setAction() 設定,利用getAction()讀取,若要使用自己定義的Action sring,使用時需加完整的package路徑
如"com.example.project.SHOW_COLOR"

3.Data:,非必填
包含資料的URI與資料的MIME type,不同的Action會需要不同的data type,譬如說
當action是設定Action_EDIT,data欄位會是需要要編輯的文件URI
當action是設定ACTION_CALL,data欄位將會是一個 tel:電話號碼的URI
當action是設定ACTION_VIEW,data欄位會是http:的URI
接收到的Activity就會去下載顯示這URI

當Activity去處理這些data時,會需要知道他的MIME Type才知道要如何處理
譬如說image檔案就不會有play功能出現

大多數都能由URI去猜測data type,譬如說,content: 的URI,資料會是在device上,可利用setData() setType() setDataAndType()來設定,而利用getData() and the type by getType()來讀取

4.Category: string Set,非必填
設定那一類型的元件可以去處理這個intent,在一個intent內可以放多個Category
以下已經預定的常數為
1.CATEGORY_BROWSABLE:target Activity可以被browswer開啟,
  如email或image
2.CATEGORY_GADGET:這Activity可以嵌在這GADGET的另一個
  Activity內
3.CATEGORY_HOME:Activity會顯示在使用者開啟device的第
  一個畫面,也就是Home按鈕開啟的畫面上
4.CATEGORY_LAUNCHER:Activity會被列在最上層的launcher上
5.CATEGORY_PREFERENCE:target Activity是preference panel
  也就是屬於preference panel才能處理接收這intent 

透過addCategory()加入,透過removeCategory()移除,透過getCategories()取得SET

5.Extras:Bundle類別,非必填
intent要傳遞給元件的其他資訊,會以Key-value pairs型態存在,有一些intent個別會有一些特別的extra資料存在
例如
ACTION_TIMEZONE_CHANGED 會有一個extra 'time-zone',值是最新的time zone
ACTION_HEADSET_PLUG有 'state' 值為"plugged"或"unplugged"
SHOW_COLOR 會有'color' 值為色碼值
可透過一系列的putXXXExtra()設定,getXXXExtra()取得
或用putExtra(Bundle)設定 getExtra()設定取得

在intent裡加入Extra有很多方式
可以先產生一個Bundle物件,把所有要加入的值都放到Bundle內
再利用intent.putExtra(bundle)放進去
也可以利用intent.putExtra(string key,string value)加入
putExtra可以呼叫多次,所有加入的值都會被累加到extra物件上
不管加入多少,都可以透過
如 intent.getExtras().getString(stringKey)方式取得資料

6.Flags:String,非必填
通知Android系統如何去啟動這Activity,例如要把這Activity加入到哪個Task內(或是啟動一個新的Task)在Intent Class內已經建好這些相關常數

沒有留言: