Android中的Intent詳細(xì)講解
在一個(gè)Android應(yīng)用中,主要是由四種組件組成的,這四種組件可參考“Android應(yīng)用的構(gòu)成”。
而這四種組件是獨(dú)立的,它們之間可以互相調(diào)用,協(xié)調(diào)工作,最終組成一個(gè)真正的Android應(yīng)用。
在這些組件之間的通訊中,主要是由Intent協(xié)助完成的。
Intent負(fù)責(zé)對(duì)應(yīng)用中一次操作的動(dòng)作、動(dòng)作涉及數(shù)據(jù)、附加數(shù)據(jù)進(jìn)行描述,Android則根據(jù)此Intent的描述,負(fù)責(zé)找到對(duì)應(yīng)的組件,將 Intent傳遞給調(diào)用的組件,并完成組件的調(diào)用。
因此,Intent在這里起著一個(gè)媒體中介的作用,專(zhuān)門(mén)提供組件互相調(diào)用的相關(guān)信息,實(shí)現(xiàn)調(diào)用者與被調(diào)用者之間的解耦。
例如,在一個(gè)聯(lián)系人維護(hù)的應(yīng)用中,當(dāng)我們?cè)谝粋€(gè)聯(lián)系人列表屏幕(假設(shè)對(duì)應(yīng)的Activity為listActivity)上,點(diǎn)擊某個(gè)聯(lián)系人后,希望能夠跳出此聯(lián)系人的詳細(xì)信息屏幕(假設(shè)對(duì)應(yīng)的Activity為detailActivity)
為了實(shí)現(xiàn)這個(gè)目的,listActivity需要構(gòu)造一個(gè) Intent,這個(gè)Intent用于告訴系統(tǒng),我們要做“查看”動(dòng)作,此動(dòng)作對(duì)應(yīng)的查看對(duì)象是“某聯(lián)系人”,然后調(diào)用startActivity (Intent intent),
將構(gòu)造的Intent傳入,系統(tǒng)會(huì)根據(jù)此Intent中的描述,到ManiFest中找到滿(mǎn)足此Intent要求的Activity,系統(tǒng)會(huì)調(diào)用找到的 Activity,即為detailActivity,最終傳入Intent,detailActivity則會(huì)根據(jù)此Intent中的描述,執(zhí)行相應(yīng)的操作。
一、抽象描述要描述什么
在Android參考文檔中,對(duì)Intent的定義是執(zhí)行某操作的一個(gè)抽象描述(確實(shí)很抽象)。我們先來(lái)看看這里的抽象描述,到底描述了什么。
首先,是要執(zhí)行的動(dòng)作(action)的一個(gè)簡(jiǎn)要描述,如VIEW_ACTION(查看)、EDIT_ACTION(修改)等,Android為我們定義了一套標(biāo)準(zhǔn)動(dòng)作:
復(fù)制內(nèi)容到剪貼板
代碼:
MAIN_ACTION
VIEW_ACTION
EDIT_ACTION
PICK_ACTION
GET_CONTENT_ACTION
DIAL_ACTION
CALL_ACTION
SENDTO_ACTION
ANSWER_ACTION
INSERT_ACTION
DELETE_ACTION
RUN_ACTION
LOGIN_ACTION
CLEAR_CREDENTIALS_ACTION
SYNC_ACTION
PICK_ACTIVITY_ACTION
WEB_SEARCH_ACTION
此外,我們還可以根據(jù)應(yīng)用的需要,定義我們自己的動(dòng)作,并可定義相應(yīng)的Activity來(lái)處理我們的自定義動(dòng)作。
其次,是執(zhí)行動(dòng)作要操作的數(shù)據(jù)(data),Android中采用指向數(shù)據(jù)的一個(gè)URI來(lái)表示,如在聯(lián)系人應(yīng)用中,一個(gè)指向某聯(lián)系人的URI可能為:content://contacts/1。
這種URI表示,通過(guò) ContentURI這個(gè)類(lèi)來(lái)描述,具體可以參考android.net.ContentURI類(lèi)的文檔。
以聯(lián)系人應(yīng)用為例,以下是一些action / data對(duì),及其它們要表達(dá)的意圖:
復(fù)制內(nèi)容到剪貼板
代碼:
VIEW_ACTION content://contacts/1-- 顯示標(biāo)識(shí)符為"1"的聯(lián)系人的詳細(xì)信息
EDIT_ACTION content://contacts/1-- 編輯標(biāo)識(shí)符為"1"的聯(lián)系人的詳細(xì)信息
VIEW_ACTION content://contacts/-- 顯示所有聯(lián)系人的列表
PICK_ACTION content://contacts/-- 顯示所有聯(lián)系人的列表,并且允許用戶(hù)在列表中選擇一個(gè)聯(lián)系人,然后把這個(gè)聯(lián)系人返回給父activity。例如:電子郵件客戶(hù)端可以使用這個(gè)Intent,要求用戶(hù)在聯(lián)系人列表中選擇一個(gè)聯(lián)系人
另外,除了action和data這兩個(gè)重要屬性外,還有一些附加屬性:
category(類(lèi)別),被執(zhí)行動(dòng)作的附加信息。例如 LAUNCHER_CATEGORY 表示Intent 的接受者應(yīng)該在Launcher中作為***應(yīng)用出現(xiàn);而ALTERNATIVE_CATEGORY表示當(dāng)前的Intent是一系列的可選動(dòng)作中的一個(gè),這些動(dòng)作可以在同一塊數(shù)據(jù)上執(zhí)行。
type(數(shù)據(jù)類(lèi)型),顯式指定Intent的數(shù)據(jù)類(lèi)型(MIME)。一般Intent的數(shù)據(jù)類(lèi)型能夠根據(jù)數(shù)據(jù)本身進(jìn)行判定,但是通過(guò)設(shè)置這個(gè)屬性,可以強(qiáng)制采用顯式指定的類(lèi)型而不再進(jìn)行推導(dǎo)。
component(組件),指定Intent的的目標(biāo)組件的類(lèi)名稱(chēng)。通常 Android會(huì)根據(jù)Intent 中包含的其它屬性的信息,比如action、data/type、category進(jìn)行查找,最終找到一個(gè)與之匹配的目標(biāo)組件。但是,如果 component這個(gè)屬性有指定的話(huà),將直接使用它指定的組件,而不再執(zhí)行上述查找過(guò)程。指定了這個(gè)屬性以后,Intent的其它所有屬性都是可選的。
extras(附加信息),是其它所有附加信息的集合。使用extras可以為組件提供擴(kuò)展信息,比如,如果要執(zhí)行“發(fā)送電子郵件”這個(gè)動(dòng)作,可以將電子郵件的標(biāo)題、正文等保存在extras里,傳給電子郵件發(fā)送組件。
總之,action、 data/type、category和extras 一起形成了一種語(yǔ)言。
這種語(yǔ)言使系統(tǒng)能夠理解諸如“查看某聯(lián)系人的詳細(xì)信息”之類(lèi)的短語(yǔ)。
隨著應(yīng)用不斷的加入到系統(tǒng)中,它們可以添加新的action、 data/type、category來(lái)擴(kuò)展這種語(yǔ)言。
應(yīng)用也可以提供自己的Activity來(lái)處理已經(jīng)存在的這樣的“短語(yǔ)”,從而改變這些“短語(yǔ)”的行為。
【編輯推薦】