您好,登錄后才能下訂單哦!
(一)概念:Intent簡單來說就是啟動或切換Activity, Service或Broadcast三大組件的。Intent使應用程序代碼在運行時動態綁定成為可能,大大降低了不同代碼之間的耦合性。Intent最常用的方法是用來啟動一個Activity。Intent封裝了一系列他要執行的動作屬性,常見的有Action,Data,Type, Category, Extras。
a: Action, Action屬性要完成的只是一個抽象的動作,這個動作具體由哪個組件(Activity或BroadcaseReceiver)來完成,Action這個屬性本身并不管。比如:Android提供的標準Action:Intent.ACTION_VIEW,他只表示一個抽象的查看操作,但具體查看什么,啟動哪個Activity他并不知道,這取決于Activity的<intent-filter../>配置,只要Activity的<intent-filter../>配置中包含了ACTION_VIEW他就有可能被啟動, 可以調用Intent的setAction()方法為Intent設置Action屬性的值。
b: Data/Type, Dta屬性是用于向Action屬性提供操作的數據,Data屬性接收一個Uri對象,一個Uri對象通常通過如下形式的字符串來表示:
content://com.android.contacts/contacts/1 tel:123
而Uri字符串總是滿足如下的格式
scheme://host:port/path
Type屬性是用于指定Data屬性向Action提供的數據的格式,即指定該Data屬性所指定的Uri所對應的MIME類型,這種MIME類型可以是任意自定義的MIME類型,只要符合abc/xyz格式的字符串即可。
Data屬性與Type屬性的關系比較微妙,這兩個屬性會互相覆蓋,比如:
-->如果為Intent先設置Data屬性后設置Type屬性,那么Data屬性將會被Type屬性所覆蓋。 -->如果為Intent先設置Type屬性后設置Data屬性,那么Type屬性則會被Data屬性所覆蓋。 -->要希望二者都同時存在,則應該調用Intent的setDataAndType()方法。
c: Extra,Extra屬性相信您應該使用過許多遍了,他用于用于在多個Action之間進行數據的交換(Activity切換時的數據傳遞intent.putExtra(...)),該屬性值應該是一個Bundle對象,Bundle對象類似于一個Map對象可以存入多個key-value鍵值對。
d: Category, Category屬性是用于向Intent提供附加信息的屬性,可以是任意的字符串,如果一個Activity中同時設置了Action與Category那么,只有當二者同時滿足Activity才會被響應,可通過Intent的addCategory()方法來設置。
說明:一個Intent對象只可以有一個Action但可以設置多個Category屬性,如果不指定Category屬性,系統會默認初始化一個Category屬性,其值為Intent.CATEGORY.DEFAULT常亮(常亮值為android.intent.category.DEFAULT組件)
(二)顯式Intent與隱式Intent。
顯式Intent通過指定Intent組件名稱來實現的,一般使用在知道目標組件名稱的前提下,指定需要轉向到的Activity,明確指定了要激活的組件,一般使用在應用程序內部。
隱式Intent:通過Intent Filter來實現的,它一般用在沒有明確指出目標組件名稱的前提下。Android系統會根據隱式意圖中設置的動作(action)、類別(category)、數據(URI和數據類型)找到最合適的組件來處理這個意圖。一般是用于在不同應用程序之間
對比:顯式Intent效率更高,因為系統可以直接精準的定位到需要激活的組件,缺點是耦合度高,例如:通過這種方法調用一些系統組件,很容易因為版本的更新,包名,類名,包結構的變化而導致程序崩潰;隱式Intent相對于效率較底下,因為每次意圖執行的時候系統都會搜索所有的intentfilter,來查看是否有匹配的內容,所以效率更底下。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。