標籤:
Data、Type
Data屬性通過用於向Action屬性提供操作的資料。Data屬性接受一個Uri(格式形如:scheme://host:port/path)對象。
Type屬性則是用於指定Data所指定Uri對應的MIME類型,MIME的格式形如:abx/xyz
聲明Data與Type屬性是通過<data…/>元素來設定,格式如下:
<data
android:mimeType=""
android:scheme=""
android:host=""
android:path=""
android:port=""/>
其匹配規則如下:
1. 如果Intent指定了Type屬性,那麼Activity只有<intent-filter…/>中的<data…/>的mimeType與Type的值相同才能被啟動
2. 如果沒有指定Type屬性,只指定了Data屬性,那麼其匹配規則如下:
如果只Activity的<data…/>中指定了scheme,那麼Intent中只要Data值中的scheme只要與Activity中的相同,其它的host、port、path不管等於多少,都可啟動該Activity。
另外還有scheme+host、scheme+host+port、scheme+host+path與上面的匹配過程一樣,只要Intent值與Activity的<data…/>值相同即可,而沒有指定host,單獨指定port和path是不起作用的。
舉個例子:
下面列了5個Activity在AndroidManifest.xml中的<data…/>屬性,下面將簡稱為a1,a2,a3,a4,a5。
<activity android:name=".DataTypeAttr" android:label="@string/title_activity_data_type_attr"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <activity android:icon="@drawable/ic_scheme" android:name=".SchemeActivity" android:label="指定scheme的Activity"> <intent-filter> <action android:name="xx" /> <category android:name="android.intent.category.DEFAULT" /> <!-- 只要Intent的Data屬性的scheme是lee即可啟動該Activity --> <data android:scheme="lee" /> </intent-filter> </activity> <activity android:icon="@drawable/ic_host" android:name=".SchemeHostPortActivity" android:label="指定scheme、host、port的Activity"> <intent-filter> <action android:name="xx" /> <category android:name="android.intent.category.DEFAULT" /> <!-- 只要Intent的Data屬性的scheme是lee、且host是www.fkjava.org 、port是8888即可啟動該Activity --> <data android:scheme="lee" android:host="www.fkjava.org" android:port="8888" /> </intent-filter> </activity> <activity android:icon="@drawable/ic_sp" android:name=".SchemeHostPathActivity" android:label="指定scheme、host、path的Activity"> <intent-filter> <action android:name="xx" /> <category android:name="android.intent.category.DEFAULT" /> <!-- 只要Intent的Data屬性的scheme是lee、且host是www.fkjava.org 、path是/mypath即可啟動該Activity --> <data android:scheme="lee" android:host="www.fkjava.org" android:path="/mypath" /> </intent-filter> </activity> <activity android:icon="@drawable/ic_path" android:name=".SchemeHostPortPathActivity" android:label="指定scheme、host、port、path的Activity"> <intent-filter> <action android:name="xx" /> <category android:name="android.intent.category.DEFAULT" /> <!-- 需要Intent的Data屬性的scheme是lee、且host是www.fkjava.org 、port是8888、且path是/mypath才可啟動該Activity --> <data android:scheme="lee" android:host="www.fkjava.org" android:port="8888" android:path="/mypath"/> </intent-filter> </activity> <activity android:icon="@drawable/ic_type" android:name=".SchemeHostPortPathTypeActivity" android:label="指定scheme、host、port、path、type的Activity"> <intent-filter> <action android:name="xx"/> <category android:name="android.intent.category.DEFAULT" /> <!-- 需要Intent的Data屬性的scheme是lee、且host是www.fkjava.org 、port是8888、且path是/mypath 、且type是abc/xyz才可啟動該Activity --> <data android:scheme="lee" android:host="www.fkjava.org" android:port="8888" android:path="/mypath" android:mimeType="abc/xyz"/> </intent-filter> </activity>
下面將舉5個Intent,下面將簡稱為i1,i2,i3,i4,i5。首先來看,只有a5設有mimeType,而下面的Intent中只有i5含有mimeType屬性,因為a5隻可能被i5啟動,而其它4個屬性也一一對應相等,因此a5可以被i5啟動。再看其它的,a1,只有scheme屬性為lee,因此,而i1,i2,i3,i4都的scheme屬性都為lee,因此a1可以被i1,i2,i3,i4啟動。a2,scheme=lee,host=www.fkjava.org,port=8888,可以被i2,i4啟動。a3,scheme=lee,host=www.fkjava.org,path=/mypath,可以被i3,i4啟動。而a4則只可以被i4啟動。
public void scheme(View source) { Intent intent = new Intent(); // 只設定Intent的Data屬性 intent.setData(Uri.parse("lee://www.crazyit.org:1234/test")); startActivity(intent); } public void schemeHostPort(View source) { Intent intent = new Intent(); // 只設定Intent的Data屬性 intent.setData(Uri.parse("lee://www.fkjava.org:8888/test")); startActivity(intent); } public void schemeHostPath(View source) { Intent intent = new Intent(); // 只設定Intent的Data屬性 intent.setData(Uri.parse("lee://www.fkjava.org:1234/mypath")); startActivity(intent); } public void schemeHostPortPath(View source) { Intent intent = new Intent(); // 只設定Intent的Data屬性 intent.setData(Uri.parse("lee://www.fkjava.org:8888/mypath")); startActivity(intent); } public void schemeHostPortPathType(View source) { Intent intent = new Intent(); // 同時設定Intent的Data、Type屬性 intent.setDataAndType(Uri.parse("lee://www.fkjava.org:8888/mypath") , "abc/xyz"); startActivity(intent); } Extra屬性
該值是一個Bundle對象,Bundle對象可以存入多個key-value對,這樣就可以通過Intent在不同的Activity之間進行資料交換。
Flag屬性
Flag屬性主要用來啟動activity時對activity的一些行為作控制,具體作用後續再研究。
目前除了對Component和Extra屬性的作用有了比較清晰的認知外,另外4個還是不太清晰,後續有待深入研究。
android開發之Intent(2)