《Android程序設計及實踐》課件第4章 意圖Intent_第1頁
《Android程序設計及實踐》課件第4章 意圖Intent_第2頁
《Android程序設計及實踐》課件第4章 意圖Intent_第3頁
《Android程序設計及實踐》課件第4章 意圖Intent_第4頁
《Android程序設計及實踐》課件第4章 意圖Intent_第5頁
已閱讀5頁,還剩26頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

了解Intent的功能及作用掌握Intent常用的屬性及方法熟悉Activity之間的消息傳遞機制了解廣播接收Intent了解Intent的實現(xiàn)策略許可本章目標-1-組成屬性設置屬性方法獲取屬性方法動作ActionsetAction()getAction()數(shù)據DatasetData()getData()分類CategoryaddCategory()getCategories()類型TypesetType()getType()組件ComponentsetComponent()setClass()setClassName()getComponent()擴展信息ExtraputExtra()getXXXExtra()獲取不同數(shù)據類型的數(shù)據,如int類型則使用getIntExtra(),字符串則使用getStringExtra()getExtras()獲取Bundle包Intent概述Intent是Android的核心組件,利用消息實現(xiàn)應用程序間的交互機制,這種消息描述了應用中一次操作的動作、數(shù)據以及附加數(shù)據,系統(tǒng)通過該Intent的描述負責找到對應的組件,并將Intent傳遞給調用的組件,完成組件的調用。Intent由動作、數(shù)據、分類、類型、組件和擴展信息等內容組成,每個組成都由相應的屬性進行表示,并提供設置和獲取相應屬性的方法。-2-Action屬性Action屬性用于描述Intent要完成的動作,對要執(zhí)行的動作進行一個簡要描述。Intent類定義了一系列Action屬性常量,用來標識一套標準動作,如ACTION_CALL(打電話)、ACTION_EDIT(編輯)等。Action屬性常量Action常量行為描述使用組件(分類)ACTION_CALL打電話,即直接呼叫Data中所帶電話號碼ActivityACTION_ANSWER接聽來電ACTION_SEND由用戶指定發(fā)送方式進行數(shù)據發(fā)送操作ACTION_SENDTO根據不同的Data類型,通過對應的軟件發(fā)送數(shù)據ACTION_VIEW根據不同的Data類型,通過對應的軟件顯示數(shù)據ACTION_EDIT顯示可編輯的數(shù)據ACTION_MAIN應用程序的入口ACTION_SYNC同步服務器與移動設備之間的數(shù)據ACTION_BATTERY_LOW警告設備電量低BroadcastACTION_HEADSET_PLUG插入或者拔出耳機ACTION_SCREEN_ON打開移動設備屏幕ACTION_TIMEZONE_CHANGED移動設備時區(qū)發(fā)生變化-3-Data屬性Intent的Data屬性是執(zhí)行動作的URI和MIME類型Data屬性常量Action和Data一般匹配使用,不同的Action由不同的Data數(shù)據指定Data屬性說明示例tel://號碼數(shù)據格式,后跟電話號碼tel://123mailto://郵件數(shù)據格式,后跟郵件收件人地址mailto://dh@163.comsmsto://短息數(shù)據格式,后跟短信接收號碼smsto://123content://內容數(shù)據格式,后跟需要讀取的內容content://contacts/people/1file://文件數(shù)據格式,后跟文件路徑file://sdcard/mymusic.mp3geo://latitude,longitude經緯數(shù)據格式,在地圖上顯示經緯度所指定的位置geo://180,65Action屬性Data屬性描述ACTION_VIEWcontent://contacts/people/1顯示_id為1的聯(lián)系人信息ACTION_EDITcontent://contacts/people/1編輯_id為1的聯(lián)系人信息ACTION_VIEWtel:123顯示電話為123的聯(lián)系人信息ACTION_VIEW在瀏覽器中瀏覽該網頁ACTION_VIEWfile:///sdcard/mymusic.mp3播放MP3-4-Category屬性Category屬性指明一個執(zhí)行Action的分類Intent中定義了一系列Category屬性常量Category屬性說明CATEGORY_DEFAULT默認的執(zhí)行方式,按照普通Activity的執(zhí)行方式執(zhí)行CATEGORY_HOME該組件為HomeActivityCATEGORY_LAUNCHER優(yōu)先級最高的Activity,通常為入口ACTION_MAIN配合使用CATEGORY_BROWSABLE可以使用瀏覽器啟動CATEGORY_GADGET可以內嵌到另外的Activity中-5-Component屬性Component屬性用于指明Intent的目標組件的類名稱。通常Android會根據Intent中包含的其他屬性的信息,比如Action、Data/Type、Category進行查找,最終找到一個與之匹配的目標組件。但是,如果指定了Component這個屬性,Intent則會直接根據組件名查找到相應的組件,而不再執(zhí)行上述查找過程。指定Component屬性后,Intent的其他屬性都是可選的。根據Intent尋找目標組件時所采用的方式不同,可以將Intent分為兩類:顯式Intent,這種方式通過直接指定組件名稱Component來實現(xiàn);隱式Intent,這種方式通過IntentFilter過濾實現(xiàn),過濾時通常根據Action、Data和Category屬性進行匹配查找。顯式Intent通過setComponent()、setClassName()或setClass()設置組件名://創(chuàng)建一個Intent對象Intentintent=newIntent();//指定Intent對象的目標組件是Activity2intent.setClass(Activity1.this,Activity2.class);當前環(huán)境目標組件-6-Extra屬性Extra屬性用于添加一些附加信息,例如發(fā)送一個郵件,就可以通過Extra屬性來添加主題(subject)和內容(body)。通過使用Intent對象的putExtra()方法來添加附加信息將一個人的姓名附加到Intent對象中,代碼如下所示Intentintent=newIntent();intent.putExtra("name","zhangsan");通過使用Intent對象的getXXXExtra()方法可以獲取附加信息。例如,將上面代碼存入Intent對象中的人名獲取出來,因存入的是字符串,所以可以使用getStringExtra()方法獲取數(shù)據Stringname=intent.getStringExtra("name");-7-Intent啟動Intent啟動不同組件的方法:核心組件調用方法作用ActivityContext.startActivity()Activity.startActivityForRestult()啟動一個Activity或使一個已存在的Activity去做新的工作ServicesContext.startService()初始化一個Service或傳遞一個新的操作給當前正在運行的ServiceContext.bindService()綁定一個已存在的ServiceBroadcastReceiverContext.sendBroadcast()Context.sendOrderedBroadcast()Context.sendStickyBroadcast()對所有想接受消息的BroadcastReceiver傳遞消息-8-Intent消息傳遞Intent的Extra屬性用于添加一些附加信息,利用該屬性可以進行消息的傳遞。將傳遞的信息存放到Extra屬性中有如下兩種方式:一種是直接調用putExtra()方法將信息添加到Extra屬性中,然后通過調用getXXXExtra()方法進行獲取即可。這種方式比較簡單、直接,主要用于數(shù)據量比較少的情況下。另一種是先將數(shù)據封裝到Bundle包中,Bundle可以被看成一個“鍵/值”映射的哈希表,當數(shù)據量比較多時,可以使用Bundle存放數(shù)據;然后通過putExtras()方法將Bundle對象添加到Extra屬性中,再通過使用getExtras()方法獲取存放的Bundle對象;最后讀取Bundle包中的數(shù)據。這種方式是間接通過Bundle包對數(shù)據先進行封裝,再進行傳遞,實現(xiàn)起來比較繁瑣,因此主要用于數(shù)據量較多的情況。-9-Intent消息傳遞-Bundle類方法功能描述Objectget(Stringkey)獲取關鍵字key對應的數(shù)據booleangetBoolean(Stringkey)獲取關鍵字key對應的布爾值,若找不到關鍵字的記錄,則返回falsebooleangetBoolean(Stringkey,booleandefaultValue)獲取關鍵字key對應的布爾值,若找不到關鍵字的記錄,則返回defaultValueBundlegetBundle(Stringkey)獲取關鍵字key對應的Bundle對象,若找不到關鍵字的記錄,則返回nullchargetChar(Stringkey)獲取關鍵字key對應的char值,若找不到關鍵字的記錄,則返回0chargetChar(Stringkey,chardefaultValue)獲取關鍵字key對應的char值,若找不到關鍵字的記錄,則返回defaultValuebooleanhasFileDescriptors()Bundle對象是否包含文件描述符,返回true則Bundle對象包含文件描述符,否則不包含voidputAll(Bundlemap)插入map到該Bundle對象中voidputBoolean(Stringkey,booleanvalue)插入布爾值value到該Bundle對象中,若關鍵字key已存在,則原有值被value替代voidputBundle(Stringkey,Bundlevalue)插入Bundle對象value到該Bundle對象中voidputByte(Stringkey,bytevalue)插入字節(jié)值value到該Bundle對象中voidremove(Stringkey)移除關鍵字為key的記錄intsize()獲取Bundle對象的關鍵字個數(shù)-10-IntentFilterIntent可以通過顯示方式或隱式方式找到目標組件,顯示方式是直接通過設置組件名來實現(xiàn),而隱式方式則是通過IntentFilter過濾實現(xiàn)。Android提供了兩種生成IntentFilter方式:一種是通過IntentFilter類生成;另一種通過在配置文件AndroidManifest.xml中定義<intent-filter>元素生成。-11-<intent-filter>元素在AndroidManifest.xml配置文件中,IntentFilter以<intent-filter>元素來指定,一個組件中可以有多個<intent-filter>元素,每個<intent-filter>元素描述不同的能力。<intent-filter>元素中常用<action>、<data>和<category>這些子元素,分別對應Intent中的Action、Data和Category屬性,用于對Intent進行匹配。<activityandroid:name="com.dh.Activity1" android:label="@string/app_name">

<intent-filter> <actionandroid:name="ent.action.MAIN"/>

<categoryandroid:name="ent.category.LAUNCHER"/> </intent-filter></activity>應用程序的入口該活動優(yōu)先級最高-12-<action>子元素一個<intent-filter>中可以添加多個<action>子元素,例如:<intent-filter>列表中的Action屬性不能為空,否則所有的Intent都會因匹配失敗而被阻塞。所以一個<intent-filter>元素下至少需要包含一個<action>子元素,這樣系統(tǒng)才能處理Intent消息。<intent-filter> <actionandroid:value="ent.action.VIEW"/> <actionandroid:value="ent.action.EDIT"/> <actionandroid:value="ent.action.PICK"/> ......</intent-filter>-13-<category>子元素一個<intent-filter>中也可以添加多個<category>子元素,例如:與Action一樣,<intent-filter>列表中的Category屬性不能為空。Category屬性的默認值“ent.category.DEFAULT”是啟動Activity的默認值,在添加其他Category屬性值時,該值必須添加,否則也會匹配失敗。<intent-filter> <categoryandroid:value="ent.category.DEFAULT"/> <categoryandroid:value="ent.category.BROWSABLE"/><intent-filter>-14-<data>子元素-1

一個<intent-filter>中可以包含多個<data>子元素,用于指定組件可以執(zhí)行的數(shù)據,例如:<intent-filter> <dataandroid:mimeType="video/mpeg" android:scheme="http" android:host="com.example.android" android:path="folder/subfolder/1" android:port="8888"/> <dataandroid:mimeType="audio/mpeg" android:scheme="http" android:host="com.example.android" android:path="folder/subfolder/2" android:port="8888"/> <dataandroid:mimeType="audio/mpeg" android:scheme="http" android:host="com.example.android" android:path="folder/subfolder/3" android:port="8888"/></intent-filter>模式MIME類型,Intent對象和過濾器都可以用“*”通配符匹配子類型字段,如“text/*”,“audio/*”表示任何子類型主機路徑端口-15-<data>子元素-2數(shù)據檢測既要檢測URI,也要檢測數(shù)據類型??蓞⒖既缦乱?guī)則:一個Intent對象既不包含URI,也不包含數(shù)據類型:僅當過濾器也不指定任何URI和數(shù)據類型時,檢測才不能通過;否則都能通過。一個Intent對象包含URI,但不包含數(shù)據類型:僅當過濾器也不指定數(shù)據類型,同時它們的URI匹配,才能通過檢測。例如,mailto:和tel:都不指定實際數(shù)據。一個Intent對象包含數(shù)據類型,但不包含URI:僅當過濾也只包含數(shù)據類型且與Intent相同,才通過檢測。一個Intent對象既包含URI,也包含數(shù)據類型(或數(shù)據類型能夠從URI推斷出):數(shù)據類型部分:只有與過濾器中之一匹配才算通過;URI部分:要出現(xiàn)在過濾器中,或者它有content:或file:URI,又或者過濾器沒有指定URI。換句話說,如果它的過濾器僅列出了數(shù)據類型,組件假定支持content:和file:。如果一個Intent能夠通過不止一個活動或服務的過濾器,用戶可能會被問哪個組件被激活。如果沒有找到目標,就會產生一個異常。-16-IntentFilter類IntentFilter類是另外一種實現(xiàn)IntentFilter的方法:方法功能描述IntentFilter()IntentFilter類的構造方法,IntentFilter類提供了四種構造函數(shù):IntentFilter()、IntentFilter(Stringaction)、IntentFilter(Stringaction,StringdataType)和IntentFilter(IntentFiltero)addAction(Stringaction)為IntentFilter添加匹配的行為例如添加電量低行為:addAction(ACTION_BATTERY_LOW)addCategory(Stringcategory)為IntentFilter添加匹配類別,如addCategory(CATEGORY_LAUNCHER)addDataAuthority(Stringhost,Stringport)獲取IntentFilter的數(shù)據驗證,如addDataAuthority(myhost,8888)。Host參數(shù)可以包含通配符*表示任意匹配,port為空表示可匹配任何端口countActions()計算IntentFilter包含的Action數(shù)量countDataAuthorities()計算IntentFilter包含的DataAuthority數(shù)量getDataAuthority(intindex)根據index獲取IntentFilter的DataAuthoritygetAction(intindex)根據index獲取IntentFilter的ActionsetPriority(intpriority)設置IntentFilter的優(yōu)先級,默認優(yōu)先級為0。通常priority值介于-1000到1000之間。Android系統(tǒng)根據優(yōu)先級匹配IntentgetPriority()獲取IntentFilter的優(yōu)先級hasCategory(Stringcategory)判斷category是否在Intent中,若包含返回ture,否則返回falsematchCategories(Set<String>categories)基于類別categories匹配IntentFilter,若匹配IntentFilter所有的類別則返回null,否則返回第一個不匹配的類別名字-17-廣播接收IntentAndroid中,可以通過實現(xiàn)廣播接收器來監(jiān)聽和響應這些廣播的Intent。通常廣播Intent用于向監(jiān)聽器通知系統(tǒng)事件或應用程序事件,從而擴展應用程序間的事件驅動的編程模型。廣播Intent可以使應用程序更加開放,通過使用Intent來廣播一個事件,可以在不用修改原始應用程序的情況下,對事件作出反應。Android中大量使用廣播Intent來廣播系統(tǒng)事件,如電池電量、網絡連接和來電。-18-廣播和接收Intent機制實現(xiàn)廣播和接收Intent機制包含四個步驟:注冊相應的廣播接收器(BroadcastReceiver),廣播接收器是接收廣播消息并對消息作出反應的組件;發(fā)送廣播,該過程將消息內容和用于過濾的信息封裝起來,并廣播給廣播接收器;滿足條件的廣播接收器執(zhí)行接收方法onReceiver();銷毀廣播接收器。-19-注冊首先繼承BroadcastReceiver,并重寫onReceive()方法publicclassMyReceiverextendsBroadcastReceiver{ @Override publicvoidonReceive(Contextcontext,Intentintent){ /*添加onReceive代碼處理*/ }}<receiverandroid:name=".MyReceiver"> <intent-filter> <actionandroid:name="vider.Telephony.SMS_RECEIVED"/> </intent-filter></receiver>IntentFiltermyfilter =newIntentFilter("vider.Telephony.SMS_RECEIVED");MyReceivermyreceiver=newMyReceiver();Context.registerReceiver(myreceiver,myfilter);然后根據IntentFilter注冊廣播Intent,Android提供了兩種Java和XML注冊方法。Java注冊XML注冊-20-廣播Activity的sendBroadcast()、sendOrderBroadcast()和sendStrikyBroadcast()方法都可以廣播Intent到廣播接收器,滿足條件的BroadcastReceiver都會執(zhí)行onReceiver方法。三個方法的區(qū)別是:sendBroadcast():這種方式不嚴格保證執(zhí)行順序。sendOrderBroadcast():這種方式保證執(zhí)行順序,根據BroadcastReceiver注冊時IntentFilter設置的優(yōu)先級的順序來執(zhí)行onReceiver()方法,高優(yōu)先級的BroadcastReceiver執(zhí)行先于低優(yōu)先級的。sendStrikyBroadcast():這種方式提供了帶有“粘著”功能且一直保存sendStrikyBroadcast()發(fā)送的Intent,以便在使用registerReceiver()注冊接收器時,新注冊的Receiver的Intent對象為該Intent對象。-21-接收廣播接收器收到廣播Intent,對Intent進行判斷。如果該接收器滿足條件,則執(zhí)行onReceiver()方法。-22-銷毀廣播接收器的onReceive()方法執(zhí)行完后,其實例就會被銷毀。執(zhí)行onReceive()時,Android系統(tǒng)會啟動一個程序計時器,如果在一定的時間內onReceive()方法沒有完成,該程序會被認為無響應。因此onReceiver()方法里需要包含快速執(zhí)行的邏輯,否則會彈出程序無響應的對話框。-23-設置Activity許可-1Android系統(tǒng)會在運行時檢查該用戶程序是否有權限調用該底層應用,因此需要通過某種方式設置Activity許可才能運行相應的應用。在AndroidManifest.xml中可以配置應用程序的權限,例如打電話應用需要調用系統(tǒng)提供的電話底層處理ACTION_CALL行為,這時需要在AndroidManifest.xml中的<uses-permission>添加打電話的許可屬性:<uses-permissionandroid:name="android.permission.CALL_PHONE"></uses-permission>/*這樣用戶就能使用ACTION_CALL來激活打電話的應用。如果不在清單文件(AndroidManifest.xml)中設置許可,則運行電話應用時會彈出提示用戶缺少相應權限的異常錯誤。*/-24-設置Activity許可-2Android系統(tǒng)提供的主要的許可:許可名字許可功能android.permission.ACCESS_CHECKIN_PROPERTIES允許讀寫在checkin數(shù)據庫中的“properties”表android.permission.ACCESS_COARSE_LOCATION允許程序通過訪問CellID或WIFI熱點來獲取粗略的位置android.permission.BLUETOOTH允許程序同匹配的藍牙設備建立連接android.permission.CALL_PHONE允許程序撥打電話,無需通過撥號器的用戶界面確認ndroid.permission.CLEAR_APP_CACHE允許用戶清除該設備上的所有安裝程序的緩存android.permission.CLEAR_APP_USER_DATA允許程序清除用戶數(shù)據android.permission.CONTROL_LOCATION_UPDATES允許啟用/禁止無線模塊的位置更新android.permission.PROCESS_OUTGOING_CALLS允許程序監(jiān)視、修改或者刪除已撥電話android.permission.READ_INPUT_STATE允許程序獲取當前按鍵狀態(tài)android.permission.REBOOT請求用戶設備重啟的操作android.permission.RECEIVE_BOOT_COMPLETED允許一個程序接收到系統(tǒng)啟動后的廣播ACTION_BOOT_COMPLETEDandroid.permission.RECEIVE_MMS允許程序處理收到MMS彩信android.permission.RECEIVE_SMS允許程序處理收到短信息android.permission.SET_TIME_ZONE允許程序設置系統(tǒng)時區(qū)android.permission.SET_WALLPAPER允許程序設置手機壁紙-25-設置Activity許可-3android.permission.STATUS_BAR允許程序打開、關閉或禁用狀態(tài)欄及圖標android.permission.WRITE_CALENDAR允許程序寫入但不讀取用戶日歷android.permission.WRITE_CONTACTS允許程序寫入但不讀取用戶聯(lián)系人數(shù)據android.permission.WRITE_GSERVICES允許程序修改Google服務地圖android.permission.WRITE_SETTINGS允許程序讀取或修改系統(tǒng)設置android.permission.WRITE_SMS允許程序修改短信android.permission.DELETE_CACHE_FILES允許程序刪除緩存文件android.permission.DELETE_PACKAGES允許程序刪除包android.permission.DEVICE_POWER允許訪問底層電源管理android.permission.DISABLE_KEYGUARD允許程序禁用鍵盤鎖android.permission.DUMP允許程序獲取系統(tǒng)服務的狀態(tài)dump信息android.permission.GET_ACCOUNTS允許訪問AccountsService中帳戶列表android.permission.GET_PACKAGE_SIZE允許程序獲取任何package占用空間大小android.permission.GET_TASKS允許程序獲取當前或最近運行的任務的概要信息android.permission.HARDWARE_TEST允許訪問程序系統(tǒng)硬件android.permission.INJECT_EVENTS允許一個程序截獲用戶事件如按鍵、觸摸、回滾等-26-設置Activity許可-4android.permission.INSTALL_PACKAGES允許程序安裝包android.permission.INTERNAL_SYSTEM_WINDOW允許打開系統(tǒng)用戶界面窗口android.permission.EXPAND_STATUS_BAR允許程序拉伸或者縮小狀態(tài)欄android.permission.INTERNET允許程序打開網絡套接字android.permission.MODIFY_AUDIO_SETTINGS允許程序修改系統(tǒng)音頻設置android.permission.MODIFY_PHONE_STATE允許修改電話狀態(tài)如充電android.permission.MOUNT_UNMOUNT_FILESYSTEMS允許掛載和反掛載移動設備android.permission.SET_ACTIVITY_WATCHER允許程序監(jiān)視和控制系統(tǒng)activities的啟動android.permission.SET_ALWAYS_FINISH允許程序控制是否活動在處于后臺時立即結束android.permission.SET_DEBUG_APP配置一個用于調試的程序android.permission.SET_ORIENTATION允許通過底層應用設置屏幕方向android.permission.SET_PREFERRED_APPLICATIONS允許程序修改默認程序列表android.permission.SET_PROCESS_FOREGROUND允許程序強制將當前運行程序轉到前臺運行android.permission.SET_PROCESS_LIMIT允許設置最大的系統(tǒng)當前運行進程數(shù)量android.permission.ACCESS_LOCATION_EXTRA_COMMANDS允許應用程序使用額外的位置提供命令android.permission.ACCESS_MOCK_LOCATION允許程序創(chuàng)建用于測試的模擬位置提供android.permission.ACCESS_NETWORK_STATE允許程序獲取網絡狀態(tài)信息android.permission.ACCESS_SURFACE_FLINGER允許程序獲取SurfaceFlinger底層

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論