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个还是不太清晰,后续有待深入研究。

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。