• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            life02

              C++博客 :: 首頁(yè) :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理 ::
              197 隨筆 :: 3 文章 :: 37 評(píng)論 :: 0 Trackbacks


            http://blog.csdn.net/louiswangbing/article/details/6610936

            Android開發(fā)組件——Intent

            Intent提供了一種通用的消息系統(tǒng),允許你的應(yīng)用程序與其它的應(yīng)用程序間傳遞Intent來(lái)執(zhí)行動(dòng)作和產(chǎn)生事件。通過使用Intent可以激活A(yù)ndroid應(yīng)用的三個(gè)核心組件:活動(dòng)、服務(wù)和廣播接收器。

            Intent 的意思是意圖,也就是說App通過Intent向android表達(dá)自己的意圖即想干什么,想啟動(dòng)另一個(gè)Activity或者去調(diào)用其它的App等 等;Intentfilter反應(yīng)了App對(duì)意圖的響應(yīng)能力,比如書上的例子撥號(hào)程序,在自己的App中聲明一個(gè)Intentfilter對(duì)這個(gè)動(dòng)作意圖 進(jìn)行相應(yīng),這樣當(dāng)我們按下?lián)芴?hào)鍵時(shí),android就會(huì)在所用的Intentfilter中找到合適的App來(lái)滿足。

            ¥  Intent的分類

            Ø  顯示意圖

            調(diào)用Intent.setComponent()或Intent.setClass()方法明確指定了組件名的Intent為顯示意圖,明確指定了Intent應(yīng)該傳遞到哪個(gè)組件。

            Ø  隱式意圖

            沒有明確指定組件名的Intent為隱式意圖。Android系統(tǒng)會(huì)根據(jù)隱式意圖中設(shè)置的動(dòng)作、類別、數(shù)據(jù)找到最適合的組件來(lái)處理這個(gè)意圖

            ¥  Intent究竟是什么

            我 們可以將Intent看成是Activity通信的標(biāo)準(zhǔn)的。比如Intent中的內(nèi)容告訴了系統(tǒng)激發(fā)Intent的Activity需要什么服務(wù),而服務(wù) 者Activity應(yīng)該滿足的條件。然后就是Android系統(tǒng)的事了,它負(fù)責(zé)找出符合條件的Activity服務(wù)者,并將Intent給 Activity服務(wù)者,然后這個(gè)Activity根據(jù)Intent中剩余的信息做出相應(yīng)的操作。由上面可知,Intent包含兩部分信息:

            Ø  Activity服務(wù)者的信息,這個(gè)是給Android用來(lái)找到合適Activity的。

            Ø  Activity服務(wù)者要做什么操作的信息,這個(gè)是給Activity服務(wù)者用的。

            ¥  Intent

            Android 中提供了Intent機(jī)制來(lái)協(xié)助應(yīng)用間的交互與通訊,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不僅可用于應(yīng)用程序之間,也可用于應(yīng)用程序內(nèi) 部的Activity/Service之間的交互。因此,Intent在這里起著一個(gè)媒體中介的作用,專門提供組件互相調(diào)用的相關(guān)信息,實(shí)現(xiàn)調(diào)用者與被調(diào) 用者之間的解耦。

            ¥  Intent的屬性

            Ø  Action

            表示要執(zhí)行的動(dòng)作,當(dāng)然也可以自定義動(dòng)作,并可定義相應(yīng)的Activity

            來(lái)處理我們的自定義動(dòng)作。

            Ø  Data

            也就是執(zhí)行動(dòng)作要操作的數(shù)據(jù)。Android中采用指向數(shù)據(jù)的一個(gè)URI

            來(lái)表示。如在聯(lián)系人應(yīng)用中,一個(gè)指向某聯(lián)系人的URI可能為:content://contacts/1。對(duì)于不同的動(dòng)作,其URI數(shù)據(jù)的類型是不同的(可以設(shè)置type屬性指定特定類型數(shù)據(jù)),如ACTION_EDIT指定Data為文件URI,打電話為tel:URI,訪問網(wǎng)絡(luò)為http:URI,而由content provider提供的數(shù)據(jù)則為content:URIs。

             如果動(dòng)作字段是ACTION_EDIT,數(shù)據(jù)字段包含將顯示用于編輯的文

            檔的URI;如果動(dòng)作時(shí)ACTION_CALL。數(shù)據(jù)字段將是一個(gè)tel:URI和將撥  打的號(hào)碼;如果動(dòng)作是ACTION_VIEW,數(shù)據(jù)字段是一個(gè)http:URI,接收活動(dòng)將被調(diào)用去下載和顯示URI指向的數(shù)據(jù)。

            Ø  Type

            數(shù)據(jù)類型,顯示指定Intent的數(shù)據(jù)類型(MIME)。一般Intent的數(shù)據(jù)

            類型能夠根據(jù)數(shù)據(jù)本身進(jìn)行判斷,但是通過設(shè)置這個(gè)屬性,可以強(qiáng)制采用顯式指定的類型而不再進(jìn)行推導(dǎo)。

            Ø  Category

            被執(zhí)行動(dòng)作的附加信息。例如LAUNCHER_CATEGORY表示intent的接

            受 者應(yīng)該在Launcher中作為頂級(jí)應(yīng)用出現(xiàn);而ALTERNATIVE_CATEGORY表示當(dāng)前的Intent是一系列的可選動(dòng)作中的一個(gè),這些動(dòng)作 可以在同一數(shù)據(jù)上執(zhí)行。Alternative表明,這個(gè)Activity可以變成OptionMenu,供其他Activity直接調(diào)用。

            Ø  Component

            指定Intent的目標(biāo)組件的類名稱。通常Android會(huì)根據(jù)Intent中包含

            的 其它屬性的信息,比如action、data/type、category進(jìn)行查找,最終找到一個(gè)與之匹配的目標(biāo)組件。但是,如果component這個(gè) 屬性有指定的話,將直接使用它指定的組件,而不再執(zhí)行上述查找過程。指定了這個(gè)屬性以后,Intent的其它所有屬性都是可選的。

            Ø  Extra

            是其它所有附加信息的集合。使用extras可以為組件提供擴(kuò)展信息,

            比如,如果要執(zhí)行“發(fā)送電子郵件”這個(gè)動(dòng)作,可以將電子郵件的標(biāo)題、正文等保存在extras里,傳給電子郵件發(fā)送組件。

            Android需要解析的是那些隱式Intent,通過解析,將Intent映射給可以

            處理此Intent的Activity、IntentReceiver或Service。Intent解析機(jī)制主要是通

            過查找已注冊(cè)在AndroidManifest.xml中的所有IntentFilter及其中定義的Intent,

            最終找到匹配的Intent。在這個(gè)解析過程中,Android是通過Intent的action、

            type、category這三個(gè)屬性來(lái)進(jìn)行判斷,判斷方法如下:

            @  如果Intent指定了action,則目標(biāo)組件的IntentFilter的action列表中就必須包含有這個(gè)action,否則就不能匹配。

            @  如果Intent沒有提供type,系統(tǒng)將從data中得到數(shù)據(jù)類型。和action一樣,目標(biāo)組件的數(shù)據(jù)類型列表中必須包含Intent的數(shù)據(jù)類型,否則不能匹配。

            @  如果Intent中的數(shù)據(jù)不是content:類型的URI,而且Intent也沒有明確指定它的type,將根據(jù)Intent中數(shù)據(jù)的scheme(比 如http:或者mailto:)進(jìn)行匹配。同上,Intent的scheme必須出現(xiàn)在目標(biāo)組件的scheme列表中。

            @  如果Intent指定了一個(gè)或多個(gè)category,這些類別必須全部出現(xiàn)在組件的類別列表中。比如Intent中包含了兩個(gè)類別:LAUNCHER_CATEGORY和ALTERNATIVE_CATEGORY,解析得到的目標(biāo)組件必須至少包含這兩個(gè)類別。

            當(dāng)匹配一個(gè)intent到一個(gè)能夠處理數(shù)據(jù)的組件,通常知道數(shù)據(jù)的類型(它

            的MIME 類型)和它的URI很重要。例如,一個(gè)組件能夠顯示圖像數(shù)據(jù),不應(yīng)該被調(diào)用去播放一個(gè)音頻文件。

             在許多情況下,數(shù)據(jù)類型能夠從URI中推測(cè),特別是content:URIs,它表

            示 位于設(shè)備上的數(shù)據(jù)且被內(nèi)容提供者(content provider)控制。但是類型也能夠顯示地設(shè)置,setData()方法指定數(shù)據(jù)的URI,setType()指定MIME類 型,setDataAndType()指定數(shù)據(jù)的URI和MIME類型。通過getData()讀取URI,getType()讀取類型。

            ¥  Intent過濾器

            活動(dòng)、服務(wù)、廣播接收者為了告知系統(tǒng)能夠處理哪些隱式Intent,它們

            可 以有一個(gè)或多個(gè)intent過濾器。每個(gè)過濾器描述組件的一種能力,即樂意接收的一組Intent。實(shí)際上,它篩掉不想要的Intents,也僅僅是不想 要的隱式Intents。一個(gè)顯示Intent總是能夠傳遞到它的目標(biāo)組件,不管它包含什么;不考慮過濾器。但是一個(gè)隱式Intent,僅當(dāng)它能夠通過組 件的過濾器之一才能夠傳遞給它。

            一個(gè)組件能夠做的每一工作有獨(dú)立的過濾器,例如,記事本中的NoteEditer活動(dòng)有兩個(gè)過濾器,一個(gè)是啟動(dòng)一個(gè)指定的記錄,用戶可以查看和編輯;另一個(gè)是啟動(dòng)一個(gè)新的、空的記錄,用戶能夠填充并保存。

            一 個(gè)intent過濾器是一個(gè)IntentFilter類的實(shí)例。因?yàn)锳ndroid系統(tǒng)在啟動(dòng)一個(gè)組件之前必須知道它的能力,但是intent過濾器通常 不在java代碼中設(shè)置,而是在應(yīng)用程序的清單文件(AndroidManifest.xml)中設(shè)置。但是有一個(gè)例外,廣播接收者的過濾器通過調(diào)用 Context.registerReceiver()動(dòng)態(tài)地注冊(cè),它直接創(chuàng)建一個(gè)IntentFilter對(duì)象。

            一 個(gè)過濾器有對(duì)應(yīng)于Intent對(duì)象的動(dòng)作、數(shù)據(jù)、種類的字段。過濾器要檢測(cè)隱式Intent的所有這三個(gè)字段,其中任何一個(gè)失敗,Android系統(tǒng)都不 會(huì)傳遞Intent給組件。然而,因?yàn)橐粋€(gè)組件可以有多個(gè)Intent過濾器,一個(gè)Intent通不過組件的過濾器檢測(cè),其它的過濾器可能通過檢測(cè)。

            一個(gè)過濾器必須至少包含一個(gè)<action>子元素,否則它將阻塞所有的Intents。

            要通過檢測(cè),Intent對(duì)象中指定的動(dòng)作必須匹配過濾器的動(dòng)作列表中的一個(gè)。如果對(duì)象或過濾器沒有指定一個(gè)動(dòng)作,結(jié)果將如下:

            ?   如果過濾器沒有指定動(dòng)作,沒有一個(gè)Intent將匹配,所有的Intent將檢測(cè)失敗,即沒有intent能夠通過過濾器。

            ?   如果Intent對(duì)象沒有指定動(dòng)作,將自動(dòng)通過檢查(只要過濾器至少有一個(gè)過濾器,否則就是上面的情況了)

            對(duì)于一個(gè)Intent要通過種類檢測(cè),Intent對(duì)象中的每個(gè)種類必須匹配過

            濾器中的一個(gè)。即過濾器能夠列出額外的種類,但是Intent對(duì)象中的種類都必須能夠在過濾器中找到,只有一個(gè)種類在過濾器列表中沒有,就算種類檢測(cè)失敗!

                    因此原則上如果一個(gè)Intent對(duì)象中沒有種類(即種類字段為空)應(yīng)該總

            是 通過種類測(cè)試,而不管過濾器中有什么種類。但是有個(gè)例外,Android對(duì)待所有傳遞給Context.startActivity()的隱式 Intent好像它們至少包含”android.intent.category.DEFAULT”(對(duì)應(yīng)CATEGORY_DEFAULT常量)。因 此,活動(dòng)想要接收隱式Intent必須要在Intent過濾器中包含”android.intent.category.DEFAULT”。

                  Intents對(duì)照著Intent過濾器匹配,不僅去發(fā)現(xiàn)一個(gè)目標(biāo)組件去激活,而且

            去 發(fā)現(xiàn)設(shè)備上的組件的其他信息。例如,Android系統(tǒng)填充應(yīng)用程序啟動(dòng)列表,最高層屏幕顯示用戶能夠啟動(dòng)的應(yīng)用程序:是通過查找所有的包含指定 了”android.intent.action.MAIN”的動(dòng)作和”android.intent.category.LAUNCHER” 種         類的過濾器的活動(dòng),然后在活動(dòng)列表中顯示這些活動(dòng)的圖標(biāo)和標(biāo)簽。類似的,   它通過查找”android.intent.category.HOME”過濾器的活動(dòng)發(fā)掘主菜單。

            ¥  Intent示例

            要實(shí)現(xiàn)兩個(gè)Activity的跳轉(zhuǎn),我們可以將要跳轉(zhuǎn)的Activity類名綁定到

            Intent對(duì)象中,然后通過startActivity方法激活I(lǐng)ntent對(duì)象中所指定的Activity,關(guān)鍵代碼如下:


            posted on 2011-12-07 23:25 life02 閱讀(352) 評(píng)論(0)  編輯 收藏 引用 所屬分類: android組件學(xué)習(xí)
            日韩精品久久久久久免费| 久久91精品国产91| 蜜臀av性久久久久蜜臀aⅴ | 国产V综合V亚洲欧美久久| 久久久久久曰本AV免费免费| 亚洲午夜无码AV毛片久久| 亚洲美日韩Av中文字幕无码久久久妻妇 | 日本精品久久久久中文字幕| 久久精品人人槡人妻人人玩AV| 久久人人爽人人爽人人片AV东京热| 亚洲欧美一级久久精品| 思思久久99热只有频精品66| 噜噜噜色噜噜噜久久| 久久天天躁夜夜躁狠狠| 少妇精品久久久一区二区三区| 欧美一区二区三区久久综| 久久人人爽人人爽人人AV| AAA级久久久精品无码片| 亚洲国产成人久久综合一| 久久久久婷婷| 亚洲乱码中文字幕久久孕妇黑人| 欧美亚洲色综久久精品国产| A狠狠久久蜜臀婷色中文网| 99久久精品免费看国产一区二区三区| 久久久艹| 亚洲午夜久久久久久久久久| 精品久久久久久无码专区| 久久久久久久久久免免费精品| 久久精品国产亚洲AV蜜臀色欲| 人妻无码αv中文字幕久久琪琪布| 久久免费国产精品一区二区| 久久精品三级视频| 久久大香香蕉国产| 日本欧美国产精品第一页久久| 国产成人无码精品久久久性色 | 久久久久夜夜夜精品国产| 亚洲综合久久久| 国产精品无码久久四虎| 亚洲va久久久噜噜噜久久| 久久久91人妻无码精品蜜桃HD| 亚洲国产另类久久久精品黑人|