implicit(隐藏) intent 和 explicit(明确) intent
啟動(dòng)那個(gè)Acitivity有兩種方式:implicit(隱藏) intent 和 explicit(明確) intent
Explicit Intent
明確的指定了要啟動(dòng)的Acitivity
比如以下Java代碼,明確指定了要啟動(dòng)B:
Intent intent= new Intent(this, B.class)?
?
Implicit Intent
沒有明確的指定要啟動(dòng)哪個(gè)Activity ,而是通過設(shè)置一些Intent Filter來讓系統(tǒng)去篩選合適的Acitivity去啟動(dòng)。
當(dāng)使用startActivity時(shí),隱式Intent解析到一個(gè)單一的Activity。如果存在多個(gè)Activity都有能力在特定的數(shù)據(jù)上執(zhí)行給定的動(dòng)作的話,Android會(huì)從這些中選擇最好的進(jìn)行啟動(dòng)。
?
Implicit Intent 到底發(fā)給哪個(gè)activity?
這需要進(jìn)行三個(gè)匹配,一個(gè)是action,一個(gè)是category,一個(gè)是data。根據(jù)三個(gè)的匹配結(jié)果,找到應(yīng)該啟動(dòng)的Activity。
?
Action Implicit Intent
動(dòng)作匹配指Android Intent Filter包含特定的動(dòng)作或沒有指定的動(dòng)作。
一個(gè)Intent Filter有一個(gè)或多個(gè)定義的動(dòng)作,如果沒有任何一個(gè)能與Intent指定的動(dòng)作匹配的話,這個(gè)Intent Filter在算作是動(dòng)作匹配檢查失敗。
<intent-filter>元素中可以包括子元素<action>,比如:
<intent-filter>
<action android:name=”com.example.project.SHOW_CURRENT” />
<action android:name=”com.example.project.SHOW_RECENT” />
<action android:name=”com.example.project.SHOW_PENDING” />
</intent-filter>
一條<intent-filter>元素至少應(yīng)該包含一個(gè)<action>,否則任何Intent請求都不能和該<intent-filter>匹配。如果Intent請求的Action和<intent-filter>中個(gè)某一條<action>匹配,那么該Intent就通過了這條<intent-filter>的動(dòng)作測試。
Category Implicit Intent
種類匹配更為嚴(yán)格。Intent Filter必須包含所有在解析的Intent中定義的種類。一個(gè)沒有特定種類的Intent Filter只能與沒有種類的Intent匹配。
<intent-filter>元素可以包含<category>子元素,比如:
<intent-filter . . . >
<category android:name=”android.Intent.Category.DEFAULT” />
<category android:name=”android.Intent.Category.BROWSABLE” />
</intent-filter>
只有當(dāng)Intent請求中所有的Category與組件中某一個(gè)IntentFilter的<category>完全匹配時(shí),才會(huì)讓該Intent請求通過測試,IntentFilter中多余的<category>聲明并不會(huì)導(dǎo)致匹配失敗。
Data Implicit Intent
Intent的數(shù)據(jù)URI中的部分會(huì)與Intent Filter中的data標(biāo)簽比較。如果Intent Filter定義scheme,host/authority,path或mimetype,這些值都會(huì)與Intent的URI比較。任何不匹配都會(huì)導(dǎo)致Intent Filter從列表中刪除。沒有指定data值的Android Intent Filter會(huì)和所有的Intent數(shù)據(jù)匹配。
- mimetype是正在匹配的數(shù)據(jù)的數(shù)據(jù)類型。當(dāng)匹配數(shù)據(jù)類型時(shí),你可以使用通配符來匹配子類型(例如,earthquakes/*)。如果Intent Filter指定一個(gè)數(shù)據(jù)類型,它必須與Intent匹配;沒有指定數(shù)據(jù)的話全部匹配。
- scheme是URI部分的協(xié)議——例如,http:,mailto:,tel:。
- host-name或“data authority”是介于URI中scheme和path之間的部分(例如,www.google.com)。匹配主機(jī)名時(shí),Intent Filter的scheme也必須通過匹配。
- 數(shù)據(jù)path是緊接在“data authority”的后面(例如,/ig)。path只在scheme和host-name部分都匹配的情況下才匹配。
數(shù)據(jù)在<intent-filter>中的描述如下:
<intent-filter . . . >
<data android:type=”video/mpeg” android:scheme=”http” . . . />
<data android:type=”audio/mpeg” android:scheme=”http” . . . />
</intent-filter>
<data>元素指定了希望接受的Intent請求的數(shù)據(jù)URI和數(shù)據(jù)類型,URI被分成三部分來進(jìn)行匹配:scheme、authority和path。其中,用setData()設(shè)定的Inteat請求的URI數(shù)據(jù)類型和scheme必須與IntentFilter中所指定的一致。若IntentFilter中還指定了authority或path,它們也需要相匹配才會(huì)通過測試。
解析出來后的處理邏輯
如果這個(gè)過程中多于一個(gè)組件解析出來的話,它們會(huì)以優(yōu)先度來排序,可以在Android Intent Filter的節(jié)點(diǎn)里添加一個(gè)可選的標(biāo)簽。最高等級(jí)的組件會(huì)返回。
Android本地的應(yīng)用程序組件和第三方應(yīng)用程序一樣,都是Intent解析過程中的一部分。它們沒有更高的優(yōu)先度,可以被新的Activity完全的代替,這些新的Activity宣告自己的Intent Filter能響應(yīng)相同的動(dòng)作請求。
?
?
應(yīng)用程序的啟動(dòng)
AndroidManifest.xml 文件中,把那個(gè) activity 配置了 <action android:name="android.intent.action.MAIN" /> ,那就就是最先被啟動(dòng)的 Activity ,如果多個(gè)設(shè)置了,則第一個(gè)設(shè)置的是最新被啟動(dòng)的 Activity。
如下圖設(shè)置,是 .SplashActivity 先啟動(dòng)的
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android"package="ghj1976.HelloWorld" android:versionCode="1"android:versionName="1.0"><uses-sdk android:minSdkVersion="3" /><application android:icon="@drawable/icon" android:label="@string/app_name"><activity android:name=".HelloWorldActivity" android:label="@string/app_name"></activity><activity android:name=".SplashActivity" android:label="@string/app_name"><intent-filter><action android:name="android.intent.action.MAIN" /><category android:name="android.intent.category.LAUNCHER" /></intent-filter></activity></application> </manifest>上面代碼中的
activity android:name:? activity 的類名,必須有。
android.intent.action.MAIN?? 決定應(yīng)用程序最先啟動(dòng)的Activity
android.intent.category.LAUNCHER???? 決定應(yīng)用程序是否顯示在程序列表里
總結(jié)
以上是生活随笔為你收集整理的implicit(隐藏) intent 和 explicit(明确) intent的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 如何做好软件售前和售前的心得体会
- 下一篇: 将一个英文句子各个的单词首字母大写