首页 > 代码库 > 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)