Intent
小提示:
Android正是使用Intent來封裝程序的“調用意圖”。不管你是想激活一個Activity,還是想啟動一個Service組件,亦或是想啟動一個Broadcast,Android統一使用Intent對象來封裝你的“啟動意圖”,這種思想極大地降低了和你要啟動的某個組件的耦合性。
Intent 也是程序應用程序組件之間數據交換、傳遞的媒介。這些通信的數據也正是通過Intent來攜帶傳遞的。
一、Intent是什么?
Intent,中文意思:意圖。Intent可能是安卓開發中最獨特、最重要的概念。Intent是一種消息傳遞機制,可以在應用內使用,也可以在多個app之間使用。
二、Intent有什么用?
Intent有兩大重要作用:
1 激活組件。
Android正是使用Intent來封裝程序的“調用意圖”。不管你是想激活一個Activity,還是想啟動一個Service組件,亦或是想啟動一個Broadcast,Android統一使用Intent對象來封裝你的“啟動意圖”,這種思想極大地降低了和你要啟動的某個組件的耦合性。
2 傳遞數據。
Intent 也是程序應用程序組件之間數據交換、傳遞的媒介。這些通信的數據也正是通過Intent來攜帶傳遞的。
三、Intent怎么用?
1 激活組件。利用Intent激活不同組件的方法:
- 激活Activity組件:
- startActivity(Intent intent)
- startAcitvityForResult(Intent intent, int requestCode)
- 激活Service組件:
- startService(Intent intent)
- boolean bindService(Intent intent,ServiceConnection conn, int flags)
- 激活Broadcast組件:
- sendBroadcast(Intent intent)無序廣播
- sendBroadcast(Intent intent, String receivePermission)無序廣播
- sendOrderedBroadcast(Intent intent, String receiverPermisson, BroadcastReceiver resultReceiver, Handler scheduler, int inintialCode, String initialData, Bundle initalExtras)有序廣播
- sendOrderedBroadcast(Intent intent, String receiverPermisson)有序廣播
- sendStickyBroadcast(Intent intent)有序廣播
- sendStickyOrderedBroadcast(Intent intent, String receiverPermisson, BroadcastReceiver resultReceiver, Handler scheduler, int inintialCode, String initialData, Bundle initalExtras)有序廣播
2 傳遞數據
Intent的Extra屬性,通常用于在多個Action之間進行數據交換,Intent的Extra屬性值應該是一個Bundle對象,Bundle對象就像一個Map對象,可以存儲多個key-value鍵值對,這樣就可以通過Intent在不同的組件之間進行數據傳遞了。
四、Intent屬性及Intent-filter配置的詳解
Intent代表了Android應用的啟動的意圖,android應用會根據Intent來啟動指定組件,至于到底啟動哪個組件,則是取決于Intent的各個屬性。
組件也有個子元素<intent-filter>,專門用來過濾Intent的,即對Intent的激活行為提出了一些限制的條件。
比如:Intent要想啟動一個Activity,就要滿足該Activity的<intent-filter>的條件才可以。
Component屬性
指明Component屬性的Intent,即明確了它將要啟動哪個組件,這種Intent也被稱為顯示Intent,沒有指定Component屬性的Intent被稱為隱式Intent,即沒有明確指明它將要啟動哪個組件,此時應用會根據Intent指定的規則去啟動符合條件的組件,但具體是那個組件則不確定。
Action屬性(一個Intent最多只能設置一個action屬性值)
Intent的Action屬性值是一個普通的字符串,該字符串代表了該Intent所要完成的一個抽象的動作。也可以理解為:為該抽象動作起了一個名字,該名字即Action的值,是一個區分動作的普普通通的字符串標識而已。
注意:一個Intent最多只能設置一個action屬性值。代碼則可以通過:Intent 對象的 setAction(String actionStr)來設置值;
- Category屬性(一個Intent能設置多個category屬性值)
Intent的Action屬性值是一個普通的字符串,該字符串代表了為一個Intent的Action增加的額外的附加類別的信息,通常Action屬性會與Category屬性結合使用。
注意:
一個Intent可以設置多個category屬性值。代碼則可以通過:Intent 對象的 addCategroy(String actionStr)來添加category屬性值;
當程序創建Intent時,如不添加category屬性值,該Intent默認啟動Category屬性值為Intent.CATEGORY_DEFAULT常量的組件;
- Data 屬性
data屬性通常用于向Action屬性提供操作的數據。Data屬性接受一個Uri對象,一個Uri對象通常形如以下的字符串:scheme://host:port/path;
-Data的“匹配”原則:
- 如果:目標組件的Data子元素,只指定了android:scheme屬性,那么Intent的Data屬性的scheme部分與android:scheme屬性值一致即可;
- 如果:目標組件的Data子元素,指定了android:scheme屬性、android:host屬性,那么Intent的Data屬性的scheme、host與android:scheme、android:host屬性值一致即可;
- 如果:目標組件的Data子元素,指定了android:scheme屬性、android:host屬性、android:port屬性,那么Intent的Data屬性的scheme、host、port部分與android:scheme、android:host、android:port屬性值一致即可;
- 如果:目標組件的Data子元素,scheme、host、port、path都指定了,那么就要求Intent的Data屬性的scheme、host、port、path部分與目標組件的Data子元素,scheme、host、port、path屬性值一致才可;
- 如果:目標組件的Data子元素,只指定了android:port、path屬性,則該port、path屬性不起限制、過濾作用。
- Type 屬性
Type屬性用于指定該Data屬性所指定Uri對應的MIME類型,這種MIME類型可以是任何自定義的MIME類型,只要是符合abc/xyz格式的字符串即可。
注意:Data屬性和Type屬性的關系:會相互覆蓋。如果希望Itent既有Data屬性,又有Type屬性,則應該調用Itent 的setDataAndType()方法;
- Extra屬性
Intent的Extra屬性,通常用于在多個Action之間進行數據交換,Intent的Extra屬性值應該是一個Bundle對象,Bundle對象就像一個Map對象,可以存儲多個key-value鍵值對,這樣就可以通過Intent在不同的組件之間進行數據傳遞了。
- 說明:<intent-filter>(一個組件(activity、service、receiver等)能設置多個<intent-filter>屬性值)
<intent-filter>是清單文件中,組件(activity、service、receiver等)的子元素,<intent-filter>正是用于表示對要響應此組件的Intent所要滿足的約束條件。一個<intent-filter>元素通常可以包含如下子元素:
<intent-filter>
0~N個<action.../>子元素,該屬性值是一個普通的字符串。即對Intent屬性的action屬性的要求;
0~N個<category.../>子元素,該屬性值是一個普通的字符串。即對Intent屬性的category屬性的要求;
0~1個<data.../>子元素
</intent-filter>
說明:上面的0~N:表示一個 <intent-filter>標簽內可以包含0或多個action、category。表明該Activity能響應Action屬性值為其中任意Intent的action屬性值為其中一個action值字符串的。