<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    瘋狂

    STANDING ON THE SHOULDERS OF GIANTS
    posts - 481, comments - 486, trackbacks - 0, articles - 1
      BlogJava :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理

    Android中的Intent

    Posted on 2009-11-04 16:08 瘋狂 閱讀(713) 評論(0)  編輯  收藏 所屬分類: android
     在一個Android應(yīng)用中,主要是由四種組件組成的,這四種組件可參考“Android應(yīng)用的構(gòu)成”。 而這四種組件是獨立的,它們之間可以互相調(diào)用,協(xié)調(diào)工作,最終組成一個真正的Android應(yīng)用。在這些組件之間的通訊中,主要是由Intent協(xié)助完成的。Intent負責對應(yīng)用中一次操作的動作、動作涉及數(shù)據(jù)、附加數(shù)據(jù)進行描述,Android則根據(jù)此Intent的描述,負責找到對應(yīng)的組件,將 Intent傳遞給調(diào)用的組件,并完成組件的調(diào)用。因此,Intent在這里起著一個媒體中介的作用,專門提供組件互相調(diào)用的相關(guān)信息,實現(xiàn)調(diào)用者與被調(diào) 用者之間的解耦。
            例如,在一個聯(lián)系人維護的應(yīng)用中,當我們在一個聯(lián)系人列表屏幕(假設(shè)對應(yīng)的Activity為listActivity)上,點擊某個聯(lián)系人后,希望能夠 跳出此聯(lián)系人的詳細信息屏幕(假設(shè)對應(yīng)的Activity為detailActivity),為了實現(xiàn)這個目的,listActivity需要構(gòu)造一個 Intent,這個Intent用于告訴系統(tǒng),我們要做“查看”動作,此動作對應(yīng)的查看對象是“某聯(lián)系人”,然后調(diào)用startActivity (Intent intent),將構(gòu)造的Intent傳入,系統(tǒng)會根據(jù)此Intent中的描述,到ManiFest中找到滿足此Intent要求的Activity,系 統(tǒng)會調(diào)用找到的Activity,即為detailActivity,最終傳入Intent,detailActivity則會根據(jù)此Intent中的描 述,執(zhí)行相應(yīng)的操作。

    一、抽象描述要描述什么
            在Android參考文檔中,對Intent的定義是執(zhí)行某操作的一個抽象描述(確實很抽象)。我們先來看看這里的抽象描述,到底描述了什么。
             首先,是要執(zhí)行的動作(action)的一個簡要描述,如VIEW_ACTION(查看)、EDIT_ACTION(修改)等,Android為我們定義了一套標準動作:
    • 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)用的需要,定義我們自己的動作,并可定義相應(yīng)的Activity來處理我們的自定義動作。

             其次,是執(zhí)行動作要操作的數(shù)據(jù)(data),Android中 采用指向數(shù)據(jù)的一個URI來表示,如在聯(lián)系人應(yīng)用中,一個指向某聯(lián)系人的URI可能為:content://contacts/1。這種URI表示,通過 ContentURI這個類來描述,具體可以參考android.net.ContentURI類的文檔。
            以聯(lián)系人應(yīng)用為例,以下是一些action / data對,及其它們要表達的意圖:
    • VIEW_ACTION content://contacts/1 -- 顯示標識符為"1"的聯(lián)系人的詳細信息
    • EDIT_ACTION content://contacts/1 -- 編輯標識符為"1"的聯(lián)系人的詳細信息
    • VIEW_ACTION content://contacts/ -- 顯示所有聯(lián)系人的列表
    • PICK_ACTION content://contacts/ -- 顯示所有聯(lián)系人的列表,并且允許用戶在列表中選擇一個聯(lián)系人,然后把這個聯(lián)系人返回給父activity。例如:電子郵件客戶端可以使用這個Intent,要求用戶在聯(lián)系人列表中選擇一個聯(lián)系人

             另外,除了action和data這兩個重要屬性外,還有一些附加屬性:
    • category(類別),被執(zhí)行動作的附加信息。例如 LAUNCHER_CATEGORY 表示Intent 的接受者應(yīng)該在Launcher中作為頂級應(yīng)用出現(xiàn);而ALTERNATIVE_CATEGORY表示當前的Intent是一系列的可選動作中的一個,這 些動作可以在同一塊數(shù)據(jù)上執(zhí)行。
    • type(數(shù)據(jù)類型),顯式指定Intent的數(shù)據(jù)類型(MIME)。一般Intent的數(shù)據(jù)類型能夠根據(jù)數(shù)據(jù)本身進行判定,但是通過設(shè)置這個屬性,可以強制采用顯式指定的類型而不再進行推導。
    • component(組件),指定Intent的的目標組件的類名稱。通常Android會 根據(jù)Intent 中包含的其它屬性的信息,比如action、data/type、category進行查找,最終找到一個與之匹配的目標組件。但是,如果 component這個屬性有指定的話,將直接使用它指定的組件,而不再執(zhí)行上述查找過程。指定了這個屬性以后,Intent的其它所有屬性都是可選的。
    • extras(附加信息),是其它所有附加信息的集合。使用extras可以為組件提供擴展信息,比如,如果要執(zhí)行“發(fā)送電子郵件”這個動作,可以將電子郵件的標題、正文等保存在extras里,傳給電子郵件發(fā)送組件。

             總之,action、 data/type、category和extras 一起形成了一種語言。這種語言使系統(tǒng)能夠理解諸如“查看某聯(lián)系人的詳細信息”之類的短語。隨著應(yīng)用不斷的加入到系統(tǒng)中,它們可以添加新的action、 data/type、category來擴展這種語言。應(yīng)用也可以提供自己的Activity來處理已經(jīng)存在的這樣的“短語”,從而改變這些“短語”的行 為。

    二、Android如何解析Intent
            在應(yīng)用中,我們可以以兩種形式來使用Intent:
    • 直接Intent:指定了component屬性的Intent(調(diào)用setComponent(ComponentName)或者setClass(Context, Class)來指定)。通過指定具體的組件類,通知應(yīng)用啟動對應(yīng)的組件。
    • 間接Intent:沒有指定comonent屬性的Intent。這些Intent需要包含足夠的信息,這樣系統(tǒng)才能根據(jù)這些信息,在在所有的可用組件中,確定滿足此Intent的組件。
            對于直接Intent,Android不需要去做解析,因為目標組件已經(jīng)很明確,Android需要解析的是那些間接Intent,通過解析,將 Intent映射給可以處理此Intent的Activity、IntentReceiver或Service。
            Intent解析機制主要是通過查找已注冊在AndroidManifest.xml中的所有IntentFilter及其中定義的Intent,最終找 到匹配的Intent。在這個解析過程中,Android是通過Intent的action、type、category這三個屬性來進行判斷的,判斷方 法如下:
    • 如果Intent指明定了action,則目標組件的IntentFilter的action列表中就必須包含有這個action,否則不能匹配;
    • 如果Intent沒有提供type,系統(tǒng)將從data中得到數(shù)據(jù)類型。和action一樣,目標組件的數(shù)據(jù)類型列表中必須包含Intent的數(shù)據(jù)類型,否則不能匹配。
    • 如果Intent中的數(shù)據(jù)不是content: 類型的URI,而且Intent也沒有明確指定它的type,將根據(jù)Intent中數(shù)據(jù)的scheme (比如 http: 或者 mailto: ) 進行匹配。同上,Intent 的scheme必須出現(xiàn)在目標組件的scheme列表中。
    • 如果Intent指定了一個或多個category,這些類別必須全部出現(xiàn)在組建的類別列表中。比如Intent中包含了兩個類別:LAUNCHER_CATEGORY 和 ALTERNATIVE_CATEGORY,解析得到的目標組件必須至少包含這兩個類別。

    轉(zhuǎn)載自:http://hi.baidu.com/weiyousheng/blog/item/1e5da62417021d3b8744f9cd.html

    主站蜘蛛池模板: 中文字幕在线观看亚洲日韩| 亚洲自偷精品视频自拍| 亚洲成a人无码亚洲成www牛牛| 永久黄色免费网站| 亚洲国产精品久久丫| 8090在线观看免费观看| 久久久久久久亚洲Av无码| 午夜精品一区二区三区免费视频 | 国产亚洲精品国产| 丰满妇女做a级毛片免费观看| 免费国产a国产片高清| ssswww日本免费网站片| 亚洲午夜久久久影院| 国产免费爽爽视频在线观看| 亚洲国产精品成人精品无码区| 久久国产精品免费网站| 久久久久亚洲精品无码蜜桃| 国产91免费在线观看| 亚洲日韩久久综合中文字幕| 免费国产精品视频| 国产福利在线观看永久免费| 亚洲AV永久无码精品一百度影院| 色欲A∨无码蜜臀AV免费播| 亚洲美女激情视频| 女人18毛片特级一级免费视频| 国产综合激情在线亚洲第一页| 亚洲视频一区二区| 久久午夜伦鲁片免费无码| 亚洲 日韩 色 图网站| 无码欧精品亚洲日韩一区夜夜嗨 | 最近最新中文字幕完整版免费高清| 国产精品无码亚洲一区二区三区| 亚洲精品无码成人片在线观看| 东北美女野外bbwbbw免费 | 精品亚洲aⅴ在线观看| 成年私人影院免费视频网站| 日本激情猛烈在线看免费观看 | 亚洲成人一级电影| 日本一道本高清免费| a级毛片在线免费观看| 99999久久久久久亚洲|