android開發之Intent(2)

來源:互聯網
上載者:User

標籤:

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)

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.