Intent解析 基于組件的架構(gòu)體系,除了有定義良好的組件,如何把這些組件組裝在一起,也是一門藝術(shù)。在Android中,Intent(貌似通常譯作:意圖...),就是連接各組件的橋梁。 前段時(shí)間看同事們做Symbian平臺(tái)的網(wǎng)易掌上郵(真
的是做的用心,NB的一米,熱情歡迎所有163郵箱的S60v3用戶,猛點(diǎn)擊之...),有個(gè)功能是為郵件添加附件,比如你想要通過郵件發(fā)送一副圖片泡
mm,可能需要有個(gè)很直觀的方式從本地選一副珍藏美圖,抑或是拿相機(jī)來個(gè)完美自拍。在Symbian中,這樣的功能,都需要你用底層的API,自己一點(diǎn)點(diǎn)
寫。為了讓選圖片體驗(yàn)更好,可能需要做一個(gè)類似于圖片瀏覽器之類的東西,為了把拍照做的更為順暢,甚至需要實(shí)現(xiàn)從聚焦到調(diào)節(jié)亮度之類一整套的相機(jī)功能。 而
其實(shí)呢,用戶的手機(jī)中可能本身就裝了其他的專業(yè)圖片瀏覽器、相機(jī)等應(yīng)用,這些應(yīng)用已經(jīng)非常出色好用,而用戶也已然能很純屬使用它們,如果能進(jìn)行調(diào)用,對(duì)郵
箱的開發(fā)者和用戶而言,都會(huì)是個(gè)更好的選擇。但在Symbian這樣殘敗的系統(tǒng)里,應(yīng)用和應(yīng)用之間的結(jié)合能力奇弱無比,想復(fù)用,基本比登天還難,作為開發(fā)
者,只能忍住一次又一次的惡心,為了用戶,做這些重復(fù)造輪子吃力不討好的附加工作。 還
好還好,在Android中,一切變得美好多了,它將開發(fā)者從接口和對(duì)象的細(xì)節(jié)中解救出來,讓我們有更多精力投入到核心功能的開發(fā)中去。在Android
中,如果你需要選個(gè)圖拍個(gè)片,只需要構(gòu)造一個(gè)描述你此項(xiàng)意愿的Intent,發(fā)送出去,系統(tǒng)會(huì)幫你選擇一個(gè)能夠處理該項(xiàng)業(yè)務(wù)的組件來滿足你的需求,而不再
需要糾結(jié)在具體的接口和實(shí)現(xiàn)上,Perfect World,便應(yīng)如此。 Intent構(gòu)成Intent被譯作意圖,其實(shí)還是很能傳神的,Intent期望做到的,就是把實(shí)現(xiàn)者和調(diào)用者完全解耦,調(diào)用者專心將以意圖描述清晰,發(fā)送出去,就可以夢(mèng)想成真,達(dá)到目的。當(dāng)然,這么說太虛了,庖丁解牛,什么東西切開來看看,也許就清晰了。Intent(reference/android/content/Intent.html),在Android中表現(xiàn)成一個(gè)類,發(fā)起一個(gè)意圖,你需要構(gòu)造這樣一個(gè)對(duì)象,并為下列幾項(xiàng)中的一些進(jìn)行賦值:
有了上述這些,一個(gè)Intent的形象就躍然紙上了,如此豐富的內(nèi)容,決定了它比傳統(tǒng)的模式,都來得強(qiáng)大。 Intent匹配上
次在moto
dev上,聽人做Android的講座,下面有很多聽客都對(duì)Intent這個(gè)概念表示出了強(qiáng)烈的興趣,拿出自己熟悉領(lǐng)域的各類概念進(jìn)行類比,比如事件、消
息之類。當(dāng)時(shí)我在想,Intent作為組件間的通信協(xié)定,與一般的簡(jiǎn)單的通信方式不同,首先,從前面部分可以看到,它的描述是針對(duì)需求而不是實(shí)現(xiàn)者來進(jìn)行
的。其次,它的解析是依托第三方而不是兩方直接進(jìn)行。 這個(gè)概念和設(shè)計(jì)模式中的中介模式(Mediator Pattern)是一脈的,即所有的外圍組件,都只和系統(tǒng)的核心模塊發(fā)生聯(lián)系,通過它進(jìn)行中轉(zhuǎn),組件之間不直接勾搭。 ![]() 如上圖所示,要想跑通整個(gè)流程,另一個(gè)很重要的東西,就是Intent Filters, 它是用來描述一個(gè)Activity或Serveice等組件,期望能夠響應(yīng)怎么樣的Intent。如果一個(gè)組件,只希望別的組件通過Explicit Intents(就是指明Component...)的方式來找到它,那么就不需要添加Intent Filters,反之,一定需要一個(gè)或若干個(gè)Intent Filters。Intent Filter的各個(gè)項(xiàng),猶如Intent照鏡子過來的效果,包括Action,Catagory,Data,Type等。 Intent Filters可以寫到配置文件中,和那些組件的配置一起(不記得什么是配置文件了,可以看這里...),若干的實(shí)例可以在Intent介紹頁面上找到(reference/android/content/Intent.html)。同樣,Intent Filters可以在代碼中,動(dòng)態(tài)插拔,這個(gè)是和動(dòng)態(tài)插拔的Broadcast Receiver是配套使用的。 系
統(tǒng)核心的模塊,會(huì)負(fù)責(zé)收集這些Intent
Filters,和它們對(duì)應(yīng)的組件信息。當(dāng)請(qǐng)求者需要一個(gè)組件幫忙,并構(gòu)造了描述它需求的Intent發(fā)送到系統(tǒng)核心,系統(tǒng)核心會(huì)將其與已知的各個(gè)
Intent
Filters進(jìn)行匹配,挑選一個(gè)符合需求的組件返回。如果有多個(gè)符合的,會(huì)嘗試看看有沒有默認(rèn)執(zhí)行的,如果沒有默認(rèn)的,就會(huì)構(gòu)造UI,讓用戶幫助抉擇,
如是,整個(gè)流程就跑通了。 Intent實(shí)現(xiàn)![]() 上圖,是請(qǐng)求一個(gè)Activity組件的簡(jiǎn)單實(shí)現(xiàn)流程圖,算是用的最多的Intent解析實(shí)例。流程從調(diào)用Context.startActivity(Intent)開始,調(diào)用者傳入構(gòu)造好的Intent對(duì)象,然后流程會(huì)讓實(shí)際的執(zhí)行者,是Instrumentation對(duì)象來完成。它是整個(gè)應(yīng)用激活的Activity管理者,集中負(fù)責(zé)該應(yīng)用內(nèi)所有Activity的起承轉(zhuǎn)合生離死別。它有一個(gè)隱藏的方法execStartActivity方法,就是負(fù)責(zé)根據(jù)Intent啟動(dòng)Activity的。去掉一些細(xì)節(jié),它做得最重要的事情,就是將此調(diào)用,通過RPC的方式,傳遞到ActivityManagerService。 前面一直再說,系統(tǒng)核心層,其實(shí)這里所謂的系統(tǒng)核心層,就是負(fù)責(zé)Android一些關(guān)鍵事務(wù)的一組服務(wù)。它們同樣運(yùn)行在虛擬機(jī)上,和普通的Service實(shí)現(xiàn)機(jī)理是一致的,只不過它們不拋頭露臉只是默默的在下層服務(wù),故謂之核心嘛。AcitivityManagerService,是負(fù)責(zé)Activity調(diào)度的服務(wù),也許日后提及調(diào)度細(xì)節(jié)的時(shí)候還會(huì)有涉及。 在這里,AcitivityManagerService會(huì)分兩個(gè)步驟完成相關(guān)操作,首先把Intent遞交給另一個(gè)服務(wù)PackageManagerService,
此服務(wù)掌握整個(gè)軟件包及其各組件的信息,它會(huì)將傳遞過來的Intent,與已知的所有Intent
Filters進(jìn)行匹配(如果帶有Component信息,就不用比了...),找到了,就把相關(guān)Component的信息通知回
AcitivityManagerService,在這里,會(huì)完成啟動(dòng)Activity這個(gè)很多細(xì)節(jié)的事情。 由此可知,啟動(dòng)Activity,要經(jīng)過多個(gè)服務(wù)的處理,并不是非常輕量的過程,在Android隨機(jī)文檔介紹性能的一節(jié)中,對(duì)此有一個(gè)評(píng)估。但這樣的操作不是會(huì)放在循環(huán)里反復(fù)折磨的那種,因此整體效果與其付出的性能代價(jià)相比,覺得是物超所值的。
|
|