移動應(yīng)用開發(fā)課件:Broadcast使用_第1頁
移動應(yīng)用開發(fā)課件:Broadcast使用_第2頁
移動應(yīng)用開發(fā)課件:Broadcast使用_第3頁
移動應(yīng)用開發(fā)課件:Broadcast使用_第4頁
移動應(yīng)用開發(fā)課件:Broadcast使用_第5頁
已閱讀5頁,還剩39頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

#6Broadcast使用場景一 如果你在等快遞,你是每天24小時(shí)守候在快遞網(wǎng)點(diǎn)等待你的包裹到來,還是你該干嘛干嘛去,等到包裹到了有人打電話通知你?場景二 我們需要程序在手機(jī)來電或接收短信時(shí),顯示電話號碼,號碼歸屬地,或者號碼在我們黑名單中的話自動掛斷或刪除短信,要如何實(shí)現(xiàn)?Broadcast(廣播)有何用?(1)2場景一相信答案很明確場景二在Symbian、WindowsMobile中,應(yīng)用若需要等待一個(gè)來電或短信,來實(shí)現(xiàn)顯示歸屬地之類的功能,必須讓自己的應(yīng)用保證開機(jī)啟動、潛伏在后臺運(yùn)行、監(jiān)控相關(guān)事件。在Android平臺中,考慮到廣泛存在這類需求,在框架中設(shè)計(jì)了BroadcastReceiver。當(dāng)發(fā)生這類事件時(shí),系統(tǒng)會自動喚醒負(fù)責(zé)接收對應(yīng)事件的Receiver,處理完事件后,Receiver就馬上退出,這對手機(jī)有限的資源來說是一種極好的解決方案Broadcast(廣播)有何用?(2)3Android中的四大組件分別是Activity、Service、Broadcast和ContentProvider。Intent是一個(gè)對動作和行為的抽象描述,負(fù)責(zé)組件之間與程序之間進(jìn)行消息傳遞。BroadcastReceiver組件提供了一種把Intent作為一個(gè)消息廣播出去,由所有對其感興趣的程序?qū)ζ渥鞒龇磻?yīng)的機(jī)制。BroadcastReceiver簡介4Intent作為一種操作系統(tǒng)級別的消息傳遞機(jī)制,能夠在不同的進(jìn)程之間傳遞結(jié)構(gòu)化消息。還記得什么是Intent嗎?(1)5例如不同Activity之間的通訊,屬于不同UI線程之間的通訊,如果要在不同的Activity之間傳遞消息,則需要用到Intent。在Intent中告訴操作系統(tǒng)要選擇哪個(gè)目標(biāo)Activity進(jìn)行實(shí)例化,并傳遞消息。還記得什么是Intent嗎?(2)Activity1Activity2AndroidSDKIntentIntent6我們在之前的實(shí)驗(yàn)里面也有寫過類似的代碼Intent中包括源Activity目標(biāo)Activity要傳遞的消息還記得什么是Intent嗎?(3)7我們在Service實(shí)驗(yàn)中也涉及到進(jìn)程間的通訊,但是在Service實(shí)驗(yàn)中我們用的是Binder。Binder實(shí)質(zhì)上是以IPC(Inter-ProcessCommunication,進(jìn)程間通信)框架為基礎(chǔ)。我們可以簡單按下圖理解,其實(shí)質(zhì)就是通過共享內(nèi)存實(shí)現(xiàn)進(jìn)程間的通訊。關(guān)于消息傳遞AndroidSDK進(jìn)程1進(jìn)程2Linuxkernel共享內(nèi)存Java層C++層8Android廣播機(jī)制包含三個(gè)基本要素:Broadcast(廣播)---發(fā)送廣播;BroadcastReceiver(廣播接收器)---接收廣播;Intent(意圖)---保存廣播信息的媒介Broadcast廣播機(jī)制(1)9Broadcast是一種廣泛運(yùn)用的在應(yīng)用程序之間傳輸信息的機(jī)制。BroadcastReceiver是對發(fā)送出來的Broadcast進(jìn)行過濾,接收并響應(yīng)的一類組件。Broadcast廣播機(jī)制(2)10廣播的詳細(xì)過程發(fā)送廣播-在需要發(fā)送信息的地方,把要發(fā)送的信息和用于過濾的信息(如Action、Category)裝入一個(gè)Intent對象,調(diào)用Context.sendBroadcast()方法把Intent對象以廣播方式發(fā)送出去。接收廣播-當(dāng)Intent發(fā)送以后,所有已經(jīng)注冊的BroadcastReceiver會檢查注冊時(shí)的IntentFilter是否與發(fā)送的Intent相匹配,若匹配則就會調(diào)用BroadcastReceiver的voidonReceive(ContextcurContext,IntentbroadcastMsg)方法。Broadcast廣播機(jī)制(3)11實(shí)現(xiàn)一個(gè)自定義的Broadcast發(fā)送廣播類:TestActivity.java接收廣播類:MyBroadcast1.javaBroadcast--最簡單的例程(1)12配置文件AndroidManifest.xml:

用<Receiver>標(biāo)簽注冊一個(gè)BroadcastReceiver,還需要有一個(gè)字符串作為filter,通過filter選擇接收廣播的類。要捕捉的信息名稱為TheStringUsedAsFilterBroadcast--最簡單的例程(2)13DemoBroadcast例程14整個(gè)流程如下:在AndroidManifest.xml配置文件中,用<Receiver>標(biāo)簽注冊一個(gè)BroadcastReceiver,還需要有一個(gè)字符串作為過濾filter,通過filter選擇接收廣播的類。TestActivity.java中將filter字符串放入intent中,再通過廣播發(fā)出去,等待系統(tǒng)接收。系統(tǒng)通過xml文件,查找到對應(yīng)的filter,映射到對應(yīng)的BroadcastReceiver類。Broadcast----最簡單的例程(3)15Broadcast機(jī)制圖示Broadcast1Broadcast2Broadcast3AndroidSDKReceiver1Receiver216Broadcast機(jī)制與Intent消息機(jī)制的圖是一致的。Broadcast機(jī)制Activity1Activity2AndroidSDKIntentIntent17通過Intent實(shí)現(xiàn)Activity間的跳轉(zhuǎn)有兩種方式:顯式Intent:即在構(gòu)造Intent對象時(shí)就指定接收者;隱式Intent:即Intent的發(fā)送者在構(gòu)造Intent對象時(shí),并不知道也不關(guān)心接收者是誰,只通過filter來選擇接收者,有利于降低發(fā)送者和接收者之間的耦合。而Broadcast的實(shí)現(xiàn)機(jī)制,與通過隱式的Intent啟動Activity的方式是類似的。Broadcast機(jī)制與Intent機(jī)制18廣播接收器僅在它執(zhí)行這個(gè)方法時(shí)處于活躍狀態(tài)。當(dāng)onReceive()返回后,它即為失活狀態(tài)。擁有一個(gè)活躍狀態(tài)的廣播接收器的進(jìn)程被保護(hù)起來而不會被殺死,但僅擁有失活狀態(tài)組件的進(jìn)程則會在其它進(jìn)程需要它所占有的內(nèi)存的時(shí)候隨時(shí)被殺掉。所以,如果響應(yīng)一個(gè)廣播信息需要很長的一段時(shí)間,我們一般會將其納入一個(gè)衍生的線程中去完成,而不是在主線程內(nèi)完成它,從而保證用戶交互過程的流暢。Broadcast的生命周期onReceive()實(shí)例化廣播對象銷毀廣播對象19當(dāng)系統(tǒng)通過filter字符串找到匹配的Receiver,onReceive方法就會被執(zhí)行。onReceive方法必須在5秒內(nèi)執(zhí)行完畢退出,否則會導(dǎo)致FC(ForceClose強(qiáng)制關(guān)閉)。Broadcast的生命周期20通常來說,BroadcastReceiver用來更新content、啟動service、更新UI或者通過notificationmanager在狀態(tài)欄中提示。5秒的限制保證了主要處理任務(wù)不會、也不應(yīng)該在BroadcastReceiver中完成。如果需要執(zhí)行大量任務(wù),可以在BroadcastReceiver中啟用Service去處理。BroadCast的應(yīng)用21在Android操作系統(tǒng)中,有許多與手機(jī)相關(guān)的事件會對系統(tǒng)發(fā)送廣播信息。當(dāng)系統(tǒng)發(fā)出廣播后,就會搜索是否注冊了負(fù)責(zé)處理該廣播的BroadcastReceiver。因此,只要了解系統(tǒng)的廣播類型,就可以實(shí)現(xiàn)很多手機(jī)自動服務(wù)功能。例如,收到新短信進(jìn)行提示、手機(jī)來電時(shí)自動拒接等等。BroadCast應(yīng)用--手機(jī)自動服務(wù)22Android中Broadcast的Intent(部分)23新短信提示(1)收到新短信,狀態(tài)欄中有提示拉下狀態(tài)欄點(diǎn)擊查看詳情24在AndroidManifest.xml里面,注冊一個(gè)Receiver,并添加intent-filter節(jié)點(diǎn),在節(jié)點(diǎn)下添加action,告訴系統(tǒng)這個(gè)Receiver用于處理哪些Broadcast(這里可以有多個(gè)action)新短信提示--AndroidManifest.xml(1)25定義一個(gè)繼承BroadcastReceiver的子類SmsReceiver,對系統(tǒng)“收到短信”這個(gè)廣播進(jìn)行處理。配置文件中receiver名為”.SmsReceiver”action名為”vider.Telephony.SMS_RECEIVED”(查看系統(tǒng)廣播intent大全)新短信提示--AndroidManifest.xml(2)26定義一個(gè)繼承BroadcastReceiver的子類重寫onReceive方法新短信提示--SmsReceiver.java27如果一個(gè)Receiver可以處理多個(gè)廣播,則需要在代碼中對各個(gè)Action進(jìn)行判斷,分別處理。其中intent變量是由onReceive方法參數(shù)傳入的,所以我們也可以看出,系統(tǒng)廣播其實(shí)也是通過sendBroadcast(intent)發(fā)出的。系統(tǒng)廣播“收信息”中,還將短信內(nèi)容附在Bundle中,隨著intent傳入到Receiver。新短信提示--SmsReceiver.java28獲取短信新短信提示--SmsReceiver.java29SmsMessage對象可以通過getDisplayOriginatingAddress(),getDisplayMessageBody()方法分別獲得發(fā)送人手機(jī)號和短信內(nèi)容。注意:如果長信息被拆成幾個(gè)短信息時(shí),發(fā)信人手機(jī)號會被保存在SmsMessage數(shù)組的最后一個(gè)元素中.新短信提示--SmsReceiver.java30如果在狀態(tài)欄顯示提示信息?--Notification新短信提示--SmsReceiver.java31圖一圖二如果在狀態(tài)欄顯示提示信息?--Notification新短信提示--SmsReceiver.java32點(diǎn)擊notification,就可以跳轉(zhuǎn)到我們intent中指定的activity。如果我們需要在目標(biāo)activity顯示短信內(nèi)容等信息時(shí),則需要在解析短信的時(shí)候,將短信內(nèi)容存入bundle,再賦給intent,并在目標(biāo)activity中解析bundle。新短信提示--SmsReceiver.java33在這個(gè)activity中,我們用兩個(gè)TextView,一個(gè)用于顯示發(fā)信人,一個(gè)用于顯示短信內(nèi)容。在onCreate中,通過代碼 獲取我們從Notification傳過來的數(shù)據(jù),進(jìn)行解析,然后顯示。新短信提示--SmsReceiverActivity.java34最后,由于程序使用到系統(tǒng)的收短信功能,所以我們需要在配置文件中,添加用戶使用權(quán)限。新短信提示----AndroidManifest.xml35程序?qū)懲曛?,你就可以將apk裝到手機(jī)上,測試下收短信的時(shí)候程序是否運(yùn)行正常。但是……沒有android手機(jī)怎么辦?或者別人沒話費(fèi)發(fā)短信給你調(diào)試程序怎么辦?不怕,有DDMS……調(diào)試程序36DDMS的全稱是DalvikDebugMonitorService,它為我們提供例如:為測試設(shè)備截屏,針對特定的進(jìn)程查看正在運(yùn)行的線程以及堆信息、Logcat、廣播狀態(tài)信息、模擬電話呼叫、接收SMS、虛擬地理坐標(biāo)等等。通過DDMS往模擬器發(fā)送短信(1)37我們上次實(shí)驗(yàn)通過DDMS的fileexplorer查看手機(jī)rom里面的數(shù)據(jù)庫文件這次我們通過EmulatorControl中的TelephonyActions往模擬器發(fā)送短信通過DDMS往模擬器發(fā)送短信(2)38當(dāng)手機(jī)收到短信的時(shí)候Receiver就實(shí)例化,執(zhí)行完onReceive函數(shù)之后Receiver對象就被注銷。那我們?nèi)绾巫N這個(gè)Receiver呢?很遺憾,這個(gè)Receiver無法注銷(Why?)唯一地關(guān)閉方法,就是進(jìn)入手機(jī)設(shè)置,把我們安裝的這個(gè)apk給刪除掉如何注銷Receiver39在AndroidManifest.xml注冊Receiver,是一種靜態(tài)注冊,所以無法注銷動態(tài)注冊:用戶進(jìn)入程序,按下注冊按鈕,注冊一個(gè)Receiver,短信一來,接收并處理廣播。如果用戶想注銷,則按下注銷按鈕,就可以把Receiver注銷,手機(jī)收到短信再也不會自動接收廣播,除非用戶重新注冊。如何注銷Receiver40動態(tài)地在代碼中先定義并設(shè)置好一個(gè)

IntentFilter對象,然后在需要注冊

溫馨提示

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

評論

0/150

提交評論