乡下人产国偷v产偷v自拍,国产午夜片在线观看,婷婷成人亚洲综合国产麻豆,久久综合给合久久狠狠狠9

  • <output id="e9wm2"></output>
    <s id="e9wm2"><nobr id="e9wm2"><ins id="e9wm2"></ins></nobr></s>

    • 分享

      深入Android 【四】 —— 組件調(diào)用

       My鏡像站 2011-11-16
      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)然,這么說太虛了,庖丁解牛,什么東西切開來看看,也許就清晰了。Intentreference/android/content/Intent.html),在Android中表現(xiàn)成一個(gè)類,發(fā)起一個(gè)意圖,你需要構(gòu)造這樣一個(gè)對(duì)象,并為下列幾項(xiàng)中的一些進(jìn)行賦值:

      1. Action。當(dāng)日常生活中,描述一個(gè)意愿或愿望的時(shí)候,總是有一個(gè)動(dòng)詞在其中。比如:我想三個(gè)俯臥撐;我要一部x片;我要一部血淚史,之類云云。在Intent中,Action就是描述看、做、寫等動(dòng)作的,當(dāng)你指明了一個(gè)Action,執(zhí)行者就會(huì)依照這個(gè)動(dòng)作的指示,接受相關(guān)輸入,表現(xiàn)對(duì)應(yīng)行為,產(chǎn)生符合的輸出。在Intent類中,定義了一批量的動(dòng)作,比如ACTION_VIEW,ACTION_PICK,之類的,基本涵蓋了常用動(dòng)作,整一個(gè)降龍十八掌全集。當(dāng)然,你也可以與時(shí)俱進(jìn),創(chuàng)造新的動(dòng)作,比如lou這樣的。與系統(tǒng)預(yù)定義的相比,這些自定義動(dòng)作的流通范圍很是有限,除非做了非常NB的應(yīng)用,大家都需要follow你,否則通常都是應(yīng)用內(nèi)部流通。
      2. Data。當(dāng)然,光有動(dòng)作還是不夠的,還需要有更確切的對(duì)象信息。比如,同樣是這個(gè)動(dòng)作,但泡咖啡,和泡妞,就差之千里了。Data的描述,在Android中,表現(xiàn)成為一個(gè)URI。用在內(nèi)部通信中,可能描述是Content Provider用的形如content://xxxx這樣的東東,抑或是外部的一個(gè)形如tel://xxxx這樣的鏈接??偠灾悄軌蚯宄?zhǔn)確的描述一個(gè)數(shù)據(jù)地址的uri。
      3. Type。說了Data,就必須要提Type,很多時(shí)候,會(huì)有人誤解,覺著Data和Type的差別,就猶如泡妞泡馬子之間的差別一樣,微乎其微。但其實(shí)不然,Type信息,是用MIME來表示的,比如text/plain, 這樣的東西。說到這里,兩者差別就很清晰了,Data就是門牌號(hào),指明了具體的位置,具體問題具體分析,而type,則是強(qiáng)調(diào)物以類聚,解決一批量的問 題。實(shí)際的例子是這樣的,比如,從某個(gè)應(yīng)用撥打一個(gè)電話,會(huì)發(fā)起的是action為ACTION_DIAL且data為tel:xxx這樣的 Intent,對(duì)應(yīng)的人類語言就是撥打xxx的電話,很具象。而如果使用type,就寬泛了許多,比如瀏覽器收到一個(gè)未知的MIME類型的數(shù)據(jù)(比如一個(gè)視頻...),就會(huì)放出這樣的Intent,求系統(tǒng)的其他應(yīng)用來幫助,表達(dá)成自然語言應(yīng)該就是:查看pdf類文檔,這樣的。
      4. Category。通過Action,配合Data或Type,很多時(shí)候可以準(zhǔn)確的表達(dá)出一個(gè)完整的意圖了,但也會(huì)有些時(shí)候,還需要加一些約束在里面才能夠更精準(zhǔn)。比如,如果你雖然很喜歡做俯臥撐,但一次做三個(gè)還只是在特殊的時(shí)候才會(huì)發(fā)生,那么你可能表達(dá)說:每次吃撐了的時(shí)候, 我都想做三個(gè)俯臥撐。吃撐了,這就對(duì)應(yīng)著Intent的Category的范疇,它給所發(fā)生的意圖附加一個(gè)約束。在Android中,一個(gè)實(shí)例是,所有應(yīng) 用主Activity(就是單獨(dú)啟動(dòng)時(shí)候,第一個(gè)運(yùn)行的那個(gè)Activity...),都需要能夠接受一個(gè)Category為 CATEGORY_LAUNCHER,Action為ACTION_Main的意圖。
      5. Component。在此之前,我們企圖用Action,Data/Type,Category去描述一個(gè)意圖,這是Android推薦,并期望大家在大多數(shù)時(shí)候使用的,這樣模式在Android中稱做Implicit Intents, 通過這種模式,提供一種靈活可擴(kuò)展的模式,給用戶和第三方應(yīng)用一個(gè)選擇權(quán)。比如,還是一個(gè)郵箱軟件,他大部分功能都好,就是選擇圖片的功能做的很土,怎么 辦?如果它采用的是Implicit Intents,那么它就是一個(gè)開放的體系了,手機(jī)中沒有其他圖片選擇程序的話,可以繼續(xù)使用郵箱默認(rèn)的,如果有,你可以任意選擇來替代原有模塊完整這功 能,一切都自然而然。但這種模式,也不是沒有成本,需要付出的是一些性能上的開銷,因?yàn)楫吘褂幸粋€(gè)檢索過程。于是,Android提供了另一種模式,叫做Explicit Intents,就需要Component的幫助了。Component就是類名,完整的,形如com.xxxxx.xxxx,一旦指明了,一切都清晰了,找的到這個(gè)類(當(dāng)然會(huì)是一個(gè)特定的子類...),成功,反之,失敗。這個(gè)好處,自然是速度,適合在你明確知道這就是一個(gè)內(nèi)部模塊的時(shí)候,使用它。
      6. Extras。通過上面的這些項(xiàng),識(shí)別問題,基本完美解決了,剩下一個(gè)重要的問題,就是傳參。Extras是用來做這個(gè)事情的,它是一個(gè)Bundle類的對(duì)象,有一組可序列化的key/value對(duì)組成。每一個(gè)Action,都會(huì)有與之對(duì)應(yīng)的key和value類型約定,發(fā)起Intent的時(shí)候,需要按照要求把Data不能表示的額外參數(shù)放入Extras中(當(dāng)然,如果不需要額外附加參數(shù),就算了...),否則執(zhí)行者拿到的時(shí)候會(huì)抓狂的。
      7. Flags。 能識(shí)別,有輸入,整個(gè)Intent基本就完整了,但還有一些附件的指令,需要放在Flags中帶過去。顧名思義,F(xiàn)lags是一個(gè)整形數(shù),有一些列的標(biāo)志 位構(gòu)成,這些標(biāo)志,是用來指明運(yùn)行模式的。比如,你期望這個(gè)意圖的執(zhí)行者,和你運(yùn)行在兩個(gè)完全不同的任務(wù)中(或說進(jìn)程也無妨吧...),就需要設(shè)置FLAG_ACTIVITY_NEW_TASK的標(biāo)志位。

      有了上述這些,一個(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à)相比,覺得是物超所值的。

        本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
        轉(zhuǎn)藏 分享 獻(xiàn)花(0

        0條評(píng)論

        發(fā)表

        請(qǐng)遵守用戶 評(píng)論公約

        類似文章 更多