Activity的啟動方式(顯示調(diào)用和隱式調(diào)用)

原則上一個Intent不應(yīng)該即是顯式調(diào)用有是隱式調(diào)用,如果二者共存以顯式調(diào)用為主。

顯式調(diào)用

需要明確指定被啟動對象的組件信息,包括包名和類名。一般是在相同的應(yīng)用程序內(nèi)部實現(xiàn)的。

Intent intent = new Intent(MainActivity.this, TestActivity.class);
startActivity(intent);

隱式調(diào)用

IntentFilter中設(shè)置過濾信息action、category、data,系統(tǒng)根據(jù)隱式意圖中的設(shè)置匹配過濾信息,只有同時匹配action類別、category類別、data類別才是能成功啟動目標(biāo)Activity。另外一點,一個Activity可以設(shè)置多個intent-filter,匹配任意一組即可。一般是用于在不同應(yīng)用程序之間。

action的匹配規(guī)則

  • 一個intent-filter中可以有多個action
  • 只要intent中的action能和intent-filter中的任何一個action相同則匹配成功。
  • 需要注意的是,intent中沒有指定action,那么匹配失敗。
  • 除此之外,action區(qū)分大小寫。

category的匹配規(guī)則

Intent中沒有category可以匹配,寫了就必須是intent-filter中定義的

  • category的匹配規(guī)則和action不同,intent中如果出現(xiàn)了category,不管有幾個,都必須是intent-filter中已經(jīng)定義的category,也就是說intent可以沒有category,一旦有,每個都必須和intent filter中定義的任意一個category相同。
  • 那為什么我們沒在intent filter中加android.intent.category.DEFAULT這個category會報錯呢?
    原因是系統(tǒng)在調(diào)用startActivity或者startActivityForResult的時候會默認(rèn)在intent中加上android.intent.category.DEFAULT這個category。
    還是以兩個Activity之間的跳轉(zhuǎn)為例:
Intent intent = new Intent();
intent.setAction("com.dev.test");
intent.addCategory("com.dev.testcat");
startActivity(intent);

AndroidManifest.xml中
<activity android:name=".TestActivity">
            <intent-filter>
                <action android:name="com.dev.test"/>
                <category android:name="com.dev.testcat"/>
                //必須加上,否者報錯
                <category android:name="android.intent.category.DEFAULT"/>
            </intent-filter>
        </activity>

data的匹配規(guī)則

data的匹配規(guī)則和action類似,如果intent filter中定義了data,那么intent中也必須要定義可匹配的data,否者匹配失敗。

data的結(jié)構(gòu)

data由兩部分組成,mimeType和URI。

  • mimeType指媒體類型,比如image/jpeg、text/plaind、video/*等,可以表示圖片、文本、視頻等不同的媒體格式。
  • URI的結(jié)構(gòu)
    URI結(jié)構(gòu)解析

data的過濾規(guī)則(1)

data規(guī)則不完整。如下所示

<intent-filter>
      <data android:mimeType="image/*"/>
</intent-filter>
intent.setDataAndType(Uri.parse("file://abc"),"image/*");
  • 這種規(guī)則指定了媒體類型為所有類型的圖片,那么intent中的mimeType屬性必須為“image/*”才能匹配成功
  • 這種情況雖然沒有指定URI,但URI部分的schema默認(rèn)值為content或file。也就是說雖然沒有指定URI,但是intent中的URI部分的schema必須為content或者file才能匹配成功,這點尤其需要注意。

data的過濾規(guī)則(1)

定義了多組data規(guī)則,并且每個data都定義了完整屬性,既有URI又有mimeType。如下所示

<intent-filter>
    <data android:mimeType="video/mpeg" android:scheme="http" ... />
    <data android:mimeType="audio/mpeg" android:scheme="http" ... />
    ...
</intent-filter>
  • 為了匹配這種intent filter,我們也需要在intent中完整定義其中一組data規(guī)則才能匹配成功。
  • 另外,如果要為intent指定完整的data,必須調(diào)用setDataAndType方法,不能先調(diào)用setData再調(diào)用setType,因為這兩個方法彼此會清除對方的值。

作者:Dueeeke
鏈接:http://www.itdecent.cn/p/3d077bfd5d29
來源:簡書
簡書著作權(quán)歸作者所有,任何形式的轉(zhuǎn)載都請聯(lián)系作者獲得授權(quán)并注明出處。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容