閃屏加入廣告鏈接或者Scheme,隱式啟動Activity

前言

Android通過Intent啟動Activity有兩種方式,分別為顯示啟動和隱式啟動,其中顯示啟動較簡單,下面就來說說隱式啟動的關(guān)鍵部分intent-filter。

當(dāng)然也可以通過隱式方式啟動Service和BroadcastReceiver,不過Android5.0以上系統(tǒng)禁止使用隱式方式啟動Service,所以我們這里就說啟動Activity。

隱式啟動

如下是MainActivity的intent-filter設(shè)置和一個隱式啟動它的代碼,可以看到隱式啟動主要是action、category、data的匹配。只有三個都匹配成功,才能啟動相應(yīng)的Activity,否則匹配失敗。一個Activity可以有多個intent-filter,只要有一個匹配成功,就可以啟動相應(yīng)的Activity。代碼如下

<activity android:name=".MainActivity">

? ? ? ? ? ? <intent-filter>

? ? ? ? ? ? ? ? <action android:name="com.sun.action.test"/>

? ? ? ? ? ? ? ? <category android:name="com.sun.category"/>

? ? ? ? ? ? ? ? <data

? ? ? ? ? ? ? ? ? ? android:host="sunHost"

? ? ? ? ? ? ? ? ? ? android:mimeType="sun/mimeType"

? ? ? ? ? ? ? ? ? ? android:path="/sunPath"

? ? ? ? ? ? ? ? ? ? android:port="8888"

? ? ? ? ? ? ? ? ? ? android:scheme="sunScheme"/>

? ? ? ? ? ? </intent-filter>

? ? ? ? </activity>


Intent intent = new Intent("com.sun.action.test");

? ? ? ? intent.addCategory("com.sun.category.test");

? ? ? ? intent.setDataAndType(Uri.parse("sunScheme://sunHost:8888/sunPath"), "sun/mimeType");

? ? ? ? startActivity(intent);

匹配規(guī)則

action

Intent中必須指定action,否則匹配失敗。

intent-filter的action可以有多條,而Intent的action最多只有一條。

Intent的action和Intent-filter中的某條action完全一樣時包括大小寫,才算匹配成功。

Intent的action只要和intent-filter中的一條action匹配成功即可。

<activity android:name=".MainActivity">

? ? ? ? <intent-filter>

? ? ? ? ? ? <action android:name="com.sun.action.test"/>

? ? ? ? ? ? <action android:name="com.sun.action.test2"/>

? ? ? ? ? ? <category android:name="android.intent.category.DEFAULT"/>

? ? ? ? </intent-filter>

? ? </activity>


下面的兩個Intent都可以匹配上面intent-filter的Activity

Intent intent = new Intent("com.sun.action.test");

? ? startActivity(intent);

? ? Intent intent1 = new Intent("com.sun.action.test1");

? ? startActivity(intent1);

category

Intent中可以不主動指定category。

intent-filter的category可以有多條,Intent的category也可以有多條。

Intent中的所有category都能在Intent-filter中找到完全一樣的category包括大小寫,才算匹配成功。

通過Intent啟動Activity的時候,系統(tǒng)會自動給Intent添加android.intent.category.DEFAULT(如果Intent自己沒有添加任何category,記得在intent-filter中添加android.intent.category.DEFAULT,不然匹配不成功)。

<activity android:name=".MainActivity">

? ? ? ? <intent-filter>

? ? ? ? ? ? <action android:name="com.sun.action.test"/>

? ? ? ? ? ? <category android:name="com.sun.category"/>

? ? ? ? ? ? <category android:name="com.sun.category1"/>

? ? ? ? ? ? <category android:name="android.intent.category.DEFAULT"/>

? ? ? ? </intent-filter>

? ? </activity>


下面的三個Intent都可以匹配上面intent-filter的Activity

Intent intent = new Intent("com.sun.action.test");

? ? intent.addCategory("com.sun.category");

? ? startActivity(intent);

? ? Intent intent1 = new Intent("com.sun.action.test");

? ? intent.addCategory("com.sun.category");

? ? intent1.addCategory("com.sun.category1");

? ? startActivity(intent1);

? ? Intent intent2 = new Intent("com.sun.action.test");

? ? startActivity(intent2);

data

再說data的匹配規(guī)則之前先講講data的語法、結(jié)構(gòu)

<data Android:host="string"

? android:mimeType="string"

? android:path="string"

? android:pathPattern="string"

? android:pathPrefix="string"

? android:port="string"

? android:scheme="string"/>


scheme://host:port/path|pathPrefix|pathPattern

http://blog.csdn.net:8080/sunzhaojie613

scheme:數(shù)據(jù)的協(xié)議部分,如http

host:主機名部分,如blog.csdn.net

port:端口,如8080

path:指定一個完整的路徑,如sunzhaojie613

pathPrefix:指定了部分路徑,它會跟Intent對象中的路徑初始部分匹配,如sunzhaojie613

pathPattern:指定的路徑可以進行正則匹配,如sunzhaojie613

mimeType:處理的數(shù)據(jù)類型,如image/*

intent-filter可以有多個data,Intent最多只有一個data。

如果intent-filter中指定了data,那么Intent就要指定一個相應(yīng)的data。

scheme匹配成功、host匹配成功、port匹配成功、path|pathPrefix|pathPattern正則匹配成功、mimeType正則匹配成功,才算data匹配成功。

intent-filter如果沒有指定scheme,默認(rèn)為content和file。

Intent通過setData來設(shè)置data,該方法會清空mimeType。通過setDataAndType來設(shè)置data和mimeType。

<activity android:name=".MainActivity">

? ? ? ? <intent-filter>

? ? ? ? ? ? <action android:name="com.sun.action.test"/>

? ? ? ? ? ? <category android:name="android.intent.category.DEFAULT"/>

? ? ? ? ? ? <data

? ? ? ? ? ? ? ? android:host="sunHost"

? ? ? ? ? ? ? ? android:mimeType="sun/mimeType"

? ? ? ? ? ? ? ? android:path="/sunPath"

? ? ? ? ? ? ? ? android:port="8888"

? ? ? ? ? ? ? ? android:scheme="sunScheme"/>

? ? ? ? </intent-filter>

? ? </activity>


下面的Intent可以匹配上面intent-filter的Activity

Intent intent = new Intent("com.sun.action.test");

? ? intent.setDataAndType(Uri.parse("sunScheme://sunHost:8888/sunPath"), "sun/mimeType");

? ? startActivity(intent);


android.intent.action.MAIN:應(yīng)用程序最先啟動的Activity,可以給多個Activity設(shè)置。

android.intent.category.LAUNCHER:應(yīng)用程序是否顯示在程序列表里,可以給多個Activity設(shè)置。

android.intent.category.DEFAULT:通過Intent啟動時系統(tǒng)會自動給Intent添加該category。

android.intent.action.VIEW:根據(jù)傳入的data執(zhí)行一些標(biāo)準(zhǔn)操作如打開瀏覽器

android.intent.action.MAIN+android.intent.category.LAUNCHER設(shè)置會在launcher顯示一個應(yīng)用圖標(biāo),單獨設(shè)置android.intent.category.LAUNCHER不會出現(xiàn)圖標(biāo),且一個應(yīng)用程序最少要有一對。

設(shè)置了intent-filter會自動將android:exported設(shè)置為true

?著作權(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)容

  • Intent組件雖然不是四大組件,但卻是連接四大組件的橋梁,學(xué)習(xí)好這個知識,也非常的重要。 一、什么是Intent...
    困惑困惑困惑閱讀 1,716評論 0 0
  • 什么是Intent intent是一個消息傳遞對象,可以使用它從其他應(yīng)用組件請求操作。通常我們用intent來啟動...
    dony_east閱讀 926評論 0 3
  • ¥開啟¥ 【iAPP實現(xiàn)進入界面執(zhí)行逐一顯】 〖2017-08-25 15:22:14〗 《//首先開一個線程,因...
    小菜c閱讀 7,334評論 0 17
  • 前言 我們在開發(fā)一個app時,最常用到的是通過Intent設(shè)置組件類名,然后啟動相應(yīng)的Activity。這種通過為...
    健忘仙森閱讀 4,121評論 0 3
  • 2. Activity的啟動模式 2.0 前言 本文總結(jié)自任玉剛老師的《Android開發(fā)藝術(shù)探索》,文章中的【示...
    Entschuldigung_閱讀 480評論 0 0

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