首页 > 代码库 > android开发之Intent(2)
android开发之Intent(2)
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)