前言
前幾天在做跳轉到系統應用通知頁的時候,用到了intent的多種用法,故現在來總結一下。
1.intent簡介
intent可以啟動activity,service或者配合廣播使用。在sdk中給出了intent作用的表現形式為:
· 通過
context.startactivity() 或者
activity.startactivityforresult() 啟動乙個activity;
· 通過
context.startservice() 啟動乙個服務,或者通過
context.bindservice() 和後台服務互動;
· 通過廣播方法發給broadcast receivers
2.intent的引數
a.component
目標元件的名字。intent可通過構造,
setclass() ,
setclassname() ,
setcomponent() 來啟動,其中
setclassname() 內部也是呼叫的
setcomponent() 。在顯式跳轉中可能會用到。
b.action
應用於隱式跳轉。
是乙個可以指明目標元件行為的字串。action很大程度上決定了category和data中應傳入的資訊;您也可以在自己的應用程式元件中指定action,以便讓其他應用程式啟動自己的元件。對應action中字串,不建議使用硬編碼的形式,而應在所屬元件的類中設定為常量。也可以自定義action:
android:name
="自定義action"
/>
android:name
="android.intent.category.default"
/>
可以通過構造方法或setaction來設定action。
安卓action大全
c.data
data屬性解析:android:scheme、android:host、android:port、android:path、android:mimetype
data的前四個屬性構成了uri的組成部分,mimetype設定了資料的型別。
android:scheme 匹配url中的字首,除了「http」、「https」、「tel」...之外,我們可以定義自己的字首
android:host 匹配url中的主機名部分,如「google.com」,如果定義為「*」則表示任意主機名
android:port 匹配url中的埠
android:path 匹配url中的路徑
mimetype則是data的型別,如
」image/png」、」image/jpeg」等
您可以呼叫
setdata()
方法設定uri,呼叫
settype()
方法設定mime型別,或呼叫
setdataandtype()
方法同時設定uri和mime型別。
請注意:如果您需要同時設定uri和mime型別,只能呼叫
setdataandtype()
方法,而不能分別呼叫
setdata()
和settype()
,因為呼叫setdata()時會首先將
settype()
中的內容置空,反之亦然
d.category
是乙個字串,表示目標元件的附加資訊,大部分intent不需要category。系統在使用隱式intent的時候,會自動幫我們新增上「android.intent.category.default」
e.extras
intent可以攜帶資訊,通過鍵值對的方式進行儲存,
可以使用
putextra()
方法將鍵值對資訊傳入,也可以將鍵值對資訊放在bundle物件中,再通過將bundle物件傳入
putextra()
中。f.flags
flag可以指導系統以何種方式啟動乙個activity、是否將啟動的activity放在該應用的任務棧中,等等。
3.intent的啟動方式
a.顯式跳轉
顯式跳轉沒有什麼可說的,指的是在intent內部直接宣告要啟動的目標所對應的class。
b.隱式跳轉
需要參考intent的action,category和data屬性。
需優先考慮action是否匹配
intent filter可定義零到多個action標籤:
"android.intent.action.edit"
/> "android.intent.action.view"
/>
...intent需要匹配上其中乙個action標籤。如果intent-filter中沒有action標籤,則intent無需action就能匹配。
再看category:
intent filter可定義零到多個category標籤:
"android.intent.category.default"
/> "android.intent.category.browsable"
/>
...intent中的定義的每乙個category都需要匹配上intent-filter中的category標籤,反之不成立(intent-filter中的category標籤可能比intent中的定義的category多)。所以無論intent-filter中是否定義了category標籤,未新增category的intent總能匹配上該intent-filter。
請注意:通過
startactivity()
或startactivityforresult()
方法隱式啟動的intent中,將自動被新增乙個category_default的category,所以若您希望自己的activity能夠被隱式啟動,則需要在intent-filter中新增乙個android.intent.category.default的category標籤。
再看data:
對data的uri來說,可以分成四個部分
scheme, host, port 和 path,每一部分在data標籤中都不是必須定義的,但存在乙個線性依賴:scheme未定義,忽略host;host未定義,忽略port;port未定義,忽略path。
在intent中新增的data只需要匹配一部分intent-filter中的data(uri匹配):
* 若filter只定義了scheme,則intent的data定義的uri中只要包含了相同的scheme,就能匹配;
* 若filter只定義了scheme和host,則intent的data定義的uri中只要包含了相同的scheme和host,就能匹配;
* 若filter只定義了scheme、host和port,則intent的data定義的uri中只要包含了相同的scheme、host和port,就能匹配
對data的
mimetype來說,有如下四種情況。
1.如果intent-filter中未指定data,則未新增data的intent可以匹配;
2.如果intent-filter中指定了uri,但未指定mimetype,則按照上一段的規則匹配(intent中也應未指定mimetype);
3.如果intent-filter中指定了mimetype,而未指定uri,則可以匹配intent中指定了相同mimetype,而未指定uri的元件;
4.如果intent-filter中同時指定了mimetype和uri,則 mimetype匹配上intent-filter中的乙個即可匹配,uri匹配規則同上。
intent intent =
new
intent();
try}
else
intent.setflags(intent.
flag_activity_new_task
);startactivity(intent);
}catch
(exception e)
sdk大於21,可進入到應用通知開關頁面,小於21只能進入應用詳情頁面
Android Intent 用法全面總結
呼叫撥號程式 給移動客服10086撥打 uri uri uri.parse tel 10086 intent intent new intent intent.action dial,uri startactivity intent 傳送簡訊或彩信 給10086傳送內容為 hello 的簡訊 uri...
Android Intent 用法全面總結
呼叫撥號程式 給移動客服10086撥打 uri uri uri.parse tel 10086 intent intent new intent intent.action dial,uri startactivity intent 傳送簡訊或彩信 給10086傳送內容為 hello 的簡訊 uri...
Android Intent的幾種用法全面總結
intent應該算是android中特有的東西。你可以在intent中指定程式要執行的動作 比如 view,edit,dial 以及程式執行到該動作時所需要的資料。都指定好後,只要呼叫startactivity android系統會自動尋找最符合你指定要求的應用程式,並執行該程式。下面列出幾種int...