什么是Intent?
Intent 是一種運(yùn)行時(shí)綁定(run-time binding)機(jī)制,它能在程序運(yùn)行過(guò)程中連接兩個(gè)不同的組件。
Intent的顯示與隱式使用
Intent intent = new Intent();
顯示使用:
intent.setClass();
intent.setClassName();
隱式使用:
intent.setAction();
startActivity(intent);
Intent Filter的四個(gè)屬性
在<intent-filter>里有Action、Category、Data三個(gè)屬性可以讓intent來(lái)匹配。
-
Action
一個(gè) Intent Filter 可以包含多個(gè) Action,指定該Activity可以執(zhí)行的動(dòng)作,它是一個(gè)用戶自定義的字符串。- 使用:
- 需要注意:
一條<intent-filter>元素至少應(yīng)該包含一個(gè)<action>,否則任何Intent請(qǐng)求都不能和該<intent-filter>匹配。
如果Intent請(qǐng)求的Action和<intent-filter>中個(gè)任意一條<action>匹配,那么該Intent就可以激活該Activity(前提是除了action的其它項(xiàng)也要通過(guò))。
-
Category
指定當(dāng)前動(dòng)作(Action)被執(zhí)行的環(huán)境,一個(gè)intent對(duì)象可以有任意個(gè)category。- 使用:
- 需要注意:
如果該activity想要通過(guò)隱式intent方式激活,至少應(yīng)該包含一個(gè)<category>。
-
Data
執(zhí)行時(shí)要操作的數(shù)據(jù)。-
使用:
intent.setData(Uri.parse("scheme://host:port/parth")); -
實(shí)例:
<data android:scheme="scott" android:host="com.scott.intent.data" android:port="7788" android:path="/target"/> intent.setData(Uri.parse("scott://com.scott.intent.data:7788/target")); -
<data/>標(biāo)簽中包含了以下幾種子元素,他們定義了url的匹配規(guī)則:
- android:scheme
匹配url中的前綴,除了“http”、“https”、“tel”...之外,我們可以定義自己的前綴; - android:host
匹配url中的主機(jī)名部分,如“google.com”,如果定義為“*”則表示任意主機(jī)名; - android:port
匹配url中的端口; - android:path
匹配url中的路徑。
- android:scheme
-
注意:
- 其中host和port是關(guān)聯(lián)的,如果host沒(méi)有設(shè)置,port也會(huì)忽略。
- 如果要設(shè)置path,那么也必須設(shè)置schema、host和port。
- 定義了執(zhí)行此Activity時(shí)所需要的數(shù)據(jù),這些數(shù)據(jù)是必須的。
- 像(scott://com.scott.intent.data:7788/target/?),就需要靈活配置。
android:path 靈活配置,可以使用android:pathPrefix,表示路徑前綴。
將android:path="/target"修改為android:pathPrefix="/target"即可。
-
Intent Filter 的匹配過(guò)程
- 加載所有的Intent Filter列表
- 去掉action匹配失敗的Intent Filter
- 去掉url匹配失敗的Intent Filter
- 去掉Category匹配失敗的Intent Filter
- 判斷剩下的Intent Filter數(shù)目是否為0。如果為0查找失敗返回異常;如果大于0,就按優(yōu)先級(jí)排序,返回最高優(yōu)先級(jí)的Intent Filter
Extras
使用:intent.putExtras();
通過(guò)創(chuàng)建Bundle對(duì)象,再通過(guò)putExtras()和getExtras()方法來(lái)存取。
三種啟動(dòng)模式
FLAG_ACTIVITY_NEW_TASK
與"singleTask"模式相同,在新的 task 中啟動(dòng) activity。如果要啟動(dòng)的 activity 已經(jīng)運(yùn)行于某 task 中,則那個(gè) task 將調(diào)入前臺(tái)。FLAG_ACTIVITY_SINGLE_TOP
與 "singleTop"模式相同,如果要啟動(dòng)的 activity位于back stack 頂,系統(tǒng)不會(huì)重新創(chuàng)建目標(biāo)Activity實(shí)例,而是直接復(fù)用Task棧頂?shù)腁ctivity。FLAG_ACTIVITY_CLEAR_TOP
如果要啟動(dòng)的 activity 已經(jīng)在當(dāng)前 task 中運(yùn)行,則不再啟動(dòng)一個(gè)新的實(shí)例,且所有在其上面的 activity 將被銷毀。
此種模式在launchMode中沒(méi)有對(duì)應(yīng)的屬性值。