青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

C++ Coder

HCP高性能計算架構,實現,編譯器指令優化,算法優化, LLVM CLANG OpenCL CUDA OpenACC C++AMP OpenMP MPI

C++博客 首頁 新隨筆 聯系 聚合 管理
  98 Posts :: 0 Stories :: 0 Comments :: 0 Trackbacks
http://bbs.hiapk.com/thread-7959-1-1.html
http://mobile.51cto.com/android-220033_1.htm

在一個Android應用中,主要是由四種組件組成的,這四種組件可參考“Android應用的構成”。
而這四種組件是獨立的,它們之間可以互相調用,協調工作,最終組成一個真正的Android應用。

在這些組件之間的通訊中,主要是由Intent協助完成的。
Intent負責對應用中一次操作的動作、動作涉及數據、附加數據進行描述,Android則根據此Intent的描述,負責找到對應的組件,將 Intent傳遞給調用的組件,并完成組件的調用。
因此,Intent在這里起著一個媒體中介的作用,專門提供組件互相調用的相關信息,實現調用者與被調用者之間的解耦。
例如,在一個聯系人維護的應用中,當我們在一個聯系人列表屏幕(假設對應的Activity為listActivity)上,點擊某個聯系人后,希望能夠跳出此聯系人的詳細信息屏幕(假設對應的Activity為detailActivity)
為了實現這個目的,listActivity需要構造一個 Intent,這個Intent用于告訴系統,我們要做“查看”動作,此動作對應的查看對象是“某聯系人”,然后調用startActivity (Intent intent),
將構造的Intent傳入,系統會根據此Intent中的描述,到ManiFest中找到滿足此Intent要求的Activity,系統會調用找到的 Activity,即為detailActivity,最終傳入Intent,detailActivity則會根據此Intent中的描述,執行相應的操作。

一、抽象描述要描述什么

在Android參考文檔中,對Intent的定義是執行某操作的一個抽象描述(確實很抽象)。我們先來看看這里的抽象描述,到底描述了什么。
首先,是要執行的動作(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
此外,我們還可以根據應用的需要,定義我們自己的動作,并可定義相應的Activity來處理我們的自定義動作。

其次,是執行動作要操作的數據(data),Android中采用指向數據的一個URI來表示,如在聯系人應用中,一個指向某聯系人的URI可能為:content://contacts/1。
這種URI表示,通過 ContentURI這個類來描述,具體可以參考android.net.ContentURI類的文檔。

以聯系人應用為例,以下是一些action / data對,及其它們要表達的意圖:
VIEW_ACTION content://contacts/1-- 顯示標識符為"1"的聯系人的詳細信息
EDIT_ACTION content://contacts/1-- 編輯標識符為"1"的聯系人的詳細信息
VIEW_ACTION content://contacts/-- 顯示所有聯系人的列表
PICK_ACTION content://contacts/-- 顯示所有聯系人的列表,并且允許用戶在列表中選擇一個聯系人,然后把這個聯系人返回給父activity。例如:電子郵件客戶端可以使用這個Intent,要求用戶在聯系人列表中選擇一個聯系人

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

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

二、Android如何解析Intent

在應用中,我們可以以兩種形式來使用Intent:
直接Intent:指定了component屬性的Intent(調用setComponent(ComponentName)或者setClass(Context, Class)來指定)。通過指定具體的組件類,通知應用啟動對應的組件。
間接Intent:沒有指定comonent屬性的Intent。這些Intent需要包含足夠的信息,這樣系統才能根據這些信息,在在所有的可用組件中,確定滿足此Intent的組件。
對于直接Intent,Android不需要去做解析,因為目標組件已經很明確,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,系統將從data中得到數據類型。和action一樣,目標組件的數據類型列表中必須包含Intent的數據類型,否則不能匹配。
如果Intent中的數據不是content: 類型的URI,而且Intent也沒有明確指定它的type,將根據Intent中數據的scheme (比如 http: 或者mailto: ) 進行匹配。同上,Intent 的scheme必須出現在目標組件的scheme列表中。
如果Intent指定了一個或多個category,這些類別必須全部出現在組建的類別列表中。比如Intent中包含了兩個類別:LAUNCHER_CATEGORY 和 ALTERNATIVE_CATEGORY,解析得到的目標組件必須至少包含這兩個類別。

三、應用例子

以下,以Android SDK中的便箋例子來說明,Intent如何定義及如何被解析。這個應用可以讓用戶瀏覽便箋列表、查看每一個便箋的詳細信息。 


  • <manifest
  • xmlns:android="http://schemas.android.com/apk/res/android"
  • package="com.google.android.notepad">
  • <application
  • android:icon="@drawable/app_notes"
  • android:label="@string/app_name">
  • <provider
  • class="NotePadProvider"
  • android:authorities="com.google.provider.NotePad"
  • />
  • <activity
  • class=".NotesList"
  • android:label="@string/title_notes_list">
  •      <intent-filter>
  •        <action android:value="android.intent.action.MAIN"/>
  •        <category android:value="android.intent.category.LAUNCHER"/>
  •       </intent-filter>
  •      <intent-filter>
  •        <action android:value="android.intent.action.VIEW"/>
  •        <action android:value="android.intent.action.EDIT"/>
  •        <action android:value="android.intent.action.PICK"/>
  •        <category android:value="android.intent.category.DEFAULT"/>
  •        <type android:value="vnd.android.cursor.dir/vnd.google.note"/>
  •       </intent-filter>
  •      <intent-filter>
  •        <action android:value="android.intent.action.GET_CONTENT"/>
  •        <category android:value="android.intent.category.DEFAULT"/>
  •        <type android:value="vnd.android.cursor.item/vnd.google.note"/>
  •       </intent-filter>
  •     </activity>
  •   <activity class=".NoteEditor" android:label="@string/title_note">
  •      <intent-filter android:label="@string/resolve_edit">
  •        <action android:value="android.intent.action.VIEW"/>
  •        <action android:value="android.intent.action.EDIT"/>
  •        <category android:value="android.intent.category.DEFAULT"/>
  •        <type android:value="vnd.android.cursor.item/vnd.google.note"/>
  •       </intent-filter>
  •      <intent-filter>
  •        <action android:value="android.intent.action.INSERT"/>
  •        <category android:value="android.intent.category.DEFAULT"/>
  •        <type android:value="vnd.android.cursor.dir/vnd.google.note"/>
  •       </intent-filter>
  •     </activity>
  •   <activity class=".TitleEditor" android:label="@string/title_edit_title" android:theme="@android:style/Theme.Dialog">
  •      <intent-filter android:label="@string/resolve_title">
  •        <action android:value="com.google.android.notepad.action.EDIT_TITLE"/>
  •        <category android:value="android.intent.category.DEFAULT"/>
  •        <category android:value="android.intent.category.ALTERNATIVE"/>
  •        <category android:value="android.intent.category.SELECTED_ALTERNATIVE"/>
  •        <type android:value="vnd.android.cursor.item/vnd.google.note"/>
  •       </intent-filter>
  •     </activity>
  • </application>
  • </manifest>

復制代碼
例子中的第一個Activity是com.google.android.notepad.NotesList,它是應用的主入口,提供了三個功能,分別由三個 intent-filter進行描述:

1、第一個是進入便箋應用的頂級入口(action為android.app.action.MAIN)。類型為android.app.category.LAUNCHER表明這個Activity將在Launcher中列出。
2、第二個是,當type為vnd.android.cursor.dir/vnd.google.note(保存便箋記錄的目錄)時,可以查看可用的便箋(action為android.app.action.VIEW),或者讓用戶選擇一個便箋并返回給調用者(action為 android.app.action.PICK)。
3、第三個是,當type為vnd.android.cursor.item/vnd.google.note時,返回給調用者一個用戶選擇的便箋(action為android.app.action.GET_CONTENT),而用戶卻不需要知道便箋從哪里讀取的。有了這些功能,下面的 Intent就會被解析到NotesList這個activity:

{ action=android.app.action.MAIN }:與此Intent匹配的Activity,將會被當作進入應用的頂級入口。
{ action=android.app.action.MAIN, category=android.app.category.LAUNCHER }:這是目前Launcher實際使用的 Intent,用于生成Launcher的頂級列表。
{ action=android.app.action.VIEW data=content://com.google.provider.NotePad/notes }:
顯示"content://com.google.provider.NotePad/notes"下的所有便箋的列表,使用者可以遍歷列表,并且察看某便箋的詳細信息。
{ action=android.app.action.PICK data=content://com.google.provider.NotePad/notes }:
顯示"content://com.google.provider.NotePad/notes"下的便箋列表,讓用戶可以在列表中選擇一個,然后將選擇的便箋的 URL返回給調用者。
{ action=android.app.action.GET_CONTENT type=vnd.android.cursor.item/vnd.google.note }:和上面的action為pick的Intent類似,不同的是這個Intent允許調用者(在這里指要調用NotesList的某個 Activity)指定它們需要返回的數據類型,系統會根據這個數據類型查找合適的 Activity(在這里系統會找到NotesList這個Activity),供用戶選擇便箋。
第二個Activity是com.google.android.notepad.NoteEditor,它為用戶顯示一條便箋,并且允許 用戶修改這個便箋。
它定義了兩個intent-filter,所以具有兩個功能。

第一個功能是,當數據類型為 vnd.android.cursor.item/vnd.google.note時,允許用戶查看和修改一個便簽(action為 android.app.action.VIEW和android.app.action.EDIT)。
第二個功能是,當數據類型為 vnd.android.cursor.dir/vnd.google.note,為調用者顯示一個新建便箋的界面,并將新建的便箋插入到便箋列表中(action為android.app.action.INSERT)。
      有了這兩個功能,下面的Intent就會被解析到NoteEditor這個activity:

{ action=android.app.action.VIEW data=content://com.google.provider.NotePad/notes/{ID}} :向用戶顯示標識為 ID的便箋。

{ action=android.app.action.EDIT data=content://com.google.provider.NotePad/notes/{ID}}:允許用戶編輯標識為ID的便箋。

{ action=android.app.action.INSERT data=content://com.google.provider.NotePad/notes }:在“content://com.google.provider.NotePad/notes”這個便箋列表中創建一個新的空便箋,并允許用戶編輯這個便簽。當用戶保存這個便箋后,這個新便箋的URI將會返回給調用者。
最后一個Activity是com.google.android.notepad.TitleEditor,它允許用戶編輯便箋的標題。

它可以被實現為一個應用可以直接調用(在Intent中明確設置component屬性)的類,不過這里我們將為你提供一個在現有的數據上發布可選操作的方法。

在這個 Activity的唯一的intent-filter中,擁有一個私有的action: com.google.android.notepad.action.EDIT_TITLE,表明允許用戶編輯便箋的標題。

和前面的view和edit 動作一樣,調用這個Intent 的時候,也必須指定具體的便箋(type為vnd.android.cursor.item/vnd.google.note)。不同的是,這里顯示和編輯的只是便箋數據中的標題。

      除了支持缺省類別(android.intent.category.DEFAULT),標題編輯器還支持另外兩個標準類別: android.intent.category.ALTERNATIVE和
android.intent.category.SELECTED_ALTERNATIVE。

實現了這兩個類別之后,其它 Activity就可以調用queryIntentActivityOptions(ComponentName, Intent[], Intent, int)查詢這個Activity提供的action,而不需要了解它的具體實現;

或者調用addIntentOptions(int, int, ComponentName, Intent[], Intent, int, Menu.Item[])建立動態菜單。需要說明的是,在這個intent-filter中有一個明確的名稱(通過android:label= "@string/resolve_title"指定),在用戶瀏覽數據的時候,如果這個Activity是數據的一個可選操作,指定明確的名稱可以為用戶提供一個更好控制界面。

有了這個功能,下面的Intent就會被解析到TitleEditor這個Activity:

{ action=com.google.android.notepad.action.EDIT_TITLE data=content://com.google.provider.NotePad/notes/{ID}}:顯示并且允許用戶編輯標識為ID的便箋的標題。
posted on 2013-04-24 14:19 jackdong 閱讀(536) 評論(0)  編輯 收藏 引用 所屬分類: Android
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            亚洲男人第一av网站| 欧美日韩在线免费视频| 欧美在线视频观看| 亚洲一二三四久久| 亚洲网站视频| 性色一区二区三区| 国内精品国产成人| 日韩西西人体444www| 久久久久久久国产| 午夜精品福利视频| 中文在线资源观看视频网站免费不卡| 在线观看亚洲视频| 国产一区二区三区在线观看精品| 欧美日韩小视频| 欧美日韩在线不卡一区| 欧美视频中文一区二区三区在线观看 | 欧美日韩不卡视频| 欧美日韩国产限制| 国产精品乱码| 国一区二区在线观看| 伊人久久大香线蕉综合热线| 狠狠入ady亚洲精品| 亚洲人成人77777线观看| 亚洲特黄一级片| 久久久xxx| 亚洲国产专区| 亚洲大片精品永久免费| 亚洲美女性视频| 亚洲欧美日韩在线不卡| 久久精品国产成人| 欧美精品在线免费| 国产一区二区三区黄| 91久久精品视频| 翔田千里一区二区| 欧美激情精品久久久久久大尺度| 亚洲精品国产欧美| 久久国产精品亚洲va麻豆| 欧美日韩日本网| 国模精品一区二区三区色天香| 91久久精品美女高潮| 久久精品国产免费看久久精品 | 亚洲人成人一区二区三区| 亚洲免费在线电影| 欧美国产精品劲爆| 国产综合色一区二区三区| 亚洲高清视频在线观看| 亚洲免费综合| 亚洲黄页一区| 久久久久久电影| 国产精品乱码一区二三区小蝌蚪| 精品999网站| 亚洲一区二区综合| 精品成人一区二区| 亚洲视屏在线播放| 蜜臀久久99精品久久久久久9 | 久久免费视频网站| 国产日韩欧美三级| 亚洲欧美一区二区三区久久| 亚洲欧洲日本一区二区三区| 久久亚洲综合色| 国产自产v一区二区三区c| 校园激情久久| 一区二区三区久久网| 欧美日产在线观看| 日韩视频一区二区在线观看| 欧美aa在线视频| 久久高清国产| 好看的av在线不卡观看| 欧美一区高清| 国产精品99久久久久久www| 欧美激情在线| 亚洲美女视频在线观看| 亚洲激情国产| 欧美日韩激情小视频| 日韩一区二区精品葵司在线| 欧美国产日韩一区| 欧美成人小视频| 亚洲精品自在在线观看| 亚洲人妖在线| 欧美三日本三级三级在线播放| 亚洲午夜伦理| 午夜视频在线观看一区二区三区 | 亚洲毛片网站| 国产精品啊啊啊| 亚洲一级片在线看| 一区二区三区高清不卡| 国产模特精品视频久久久久| 久久久不卡网国产精品一区| 久久亚洲精品一区| 一本久久青青| 亚洲综合三区| 在线播放一区| 亚洲国产日韩欧美在线99| 欧美日产在线观看| 欧美一级久久久久久久大片| 欧美在线视频免费| 一区福利视频| 亚洲久久在线| 狠狠色综合色综合网络| 亚洲二区在线视频| 国产精品黄色在线观看| 久久婷婷国产综合国色天香| 欧美激情成人在线视频| 亚洲欧美日韩网| 久久综合网色—综合色88| 亚洲少妇在线| 久久天堂精品| 先锋影音一区二区三区| 巨乳诱惑日韩免费av| 亚洲一区二区三区在线看| 欧美在线观看一区| 中日韩高清电影网| 久久久噜噜噜久噜久久| 欧美激情视频给我| 久久久五月天| 国产精品v日韩精品| 久久av二区| 欧美另类极品videosbest最新版本| 欧美一区二区三区免费观看视频| 男人的天堂亚洲在线| 先锋影音久久久| 欧美日韩另类在线| 欧美黑人多人双交| 国产一区三区三区| 一区二区三区四区五区精品视频| 在线观看欧美视频| 午夜欧美精品久久久久久久| 亚洲精品网站在线播放gif| 久久久久国产精品麻豆ai换脸| 亚洲私人影院在线观看| 久久久综合香蕉尹人综合网| 久久久国产成人精品| 国产精品中文在线| 亚洲图片欧美午夜| 正在播放亚洲一区| 欧美视频精品一区| 一区二区三区免费观看| 中国成人黄色视屏| 欧美日韩在线综合| 99精品国产在热久久婷婷| 在线看日韩欧美| 老牛国产精品一区的观看方式| 久久久蜜桃一区二区人| 国产专区一区| 久久久精彩视频| 久久精品一二三区| 国内自拍亚洲| 久久精品国产一区二区三| 久久只精品国产| 一区在线免费观看| 毛片一区二区三区| 亚洲国产精品久久精品怡红院| 亚洲精品123区| 欧美剧在线观看| 亚洲肉体裸体xxxx137| 亚洲综合色婷婷| 国产三级精品在线不卡| 久久精品首页| 老巨人导航500精品| 亚洲国产天堂久久国产91| 久久男人资源视频| 欧美高清在线播放| 亚洲精品四区| 国产乱码精品一区二区三区忘忧草| 亚洲日本理论电影| 亚洲欧美激情一区二区| 狠狠入ady亚洲精品经典电影| 久久综合久久综合这里只有精品 | 国产精品免费福利| 久久高清一区| 亚洲激情在线播放| 亚洲一区激情| 狠狠久久亚洲欧美专区| 欧美二区在线播放| 亚洲图色在线| 免费av成人在线| 亚洲视频网站在线观看| 国产精品一区在线观看| 久久天堂精品| 999亚洲国产精| 国产色综合久久| 免费一级欧美片在线播放| 中文久久乱码一区二区| 免费黄网站欧美| 亚洲欧美日韩视频二区| 亚洲欧洲综合另类在线| 国产精品高潮呻吟久久| 久久久噜噜噜久久中文字幕色伊伊| 亚洲国产精品专区久久| 久久精品国产精品亚洲| 99精品国产高清一区二区| 国产欧美一区二区视频| 欧美乱妇高清无乱码| 久久精品一区二区三区不卡牛牛 | 最近中文字幕mv在线一区二区三区四区| 亚洲在线播放电影| 亚洲第一天堂av| 国产精品久久久久7777婷婷| 欧美大片免费久久精品三p| 午夜免费在线观看精品视频|