Android應(yīng)用程序開(kāi)發(fā) 課件 第5章 Android核心組件-BroadcastReceiver_第1頁(yè)
Android應(yīng)用程序開(kāi)發(fā) 課件 第5章 Android核心組件-BroadcastReceiver_第2頁(yè)
Android應(yīng)用程序開(kāi)發(fā) 課件 第5章 Android核心組件-BroadcastReceiver_第3頁(yè)
Android應(yīng)用程序開(kāi)發(fā) 課件 第5章 Android核心組件-BroadcastReceiver_第4頁(yè)
Android應(yīng)用程序開(kāi)發(fā) 課件 第5章 Android核心組件-BroadcastReceiver_第5頁(yè)
已閱讀5頁(yè),還剩52頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

第5章Android核心組件—BroadcastReceiver

本章簡(jiǎn)介為了便于處理系統(tǒng)級(jí)的通知或消息,Android引入了一類稱為廣播的消息機(jī)制。BroadcastReceiver則是一種全局消息監(jiān)聽(tīng)器,它用于監(jiān)聽(tīng)系統(tǒng)全局的廣播消息。BroadcastReceiver也是Android四大組件中唯一的被動(dòng)接收數(shù)據(jù)的組件,可以非常方便地用于不同應(yīng)用程序之間的通信。本章將在對(duì)Android廣播機(jī)制介紹的基礎(chǔ)之上,重點(diǎn)講解如何使用BroadcastReceiver發(fā)送和接收自定義廣播消息,如何使用BroadcastReceiver發(fā)送和接收系統(tǒng)廣播消息,以及如何使用BroadcastReceiver發(fā)送和接收本地廣播消息。本章目錄5.1廣播機(jī)制簡(jiǎn)介5.2廣播的處理流程(整節(jié)替換)5.3發(fā)送與接收自定義廣播5.4接收系統(tǒng)廣播5.5使用本地廣播5.6小結(jié)5.7習(xí)題5.1

廣播機(jī)制簡(jiǎn)介Android系統(tǒng)提供了一套完善的API,允許應(yīng)用程序自由地發(fā)送或接收廣播。每個(gè)應(yīng)用程序都可以向系統(tǒng)注冊(cè)自己感興趣的廣播數(shù)據(jù),并在數(shù)據(jù)發(fā)生改變時(shí)接收到廣播內(nèi)容的更新。廣播消息既可以是來(lái)自于Android系統(tǒng),也可以來(lái)自于其它應(yīng)用程序。Android中的廣播主要分為以下兩種類型:1.標(biāo)準(zhǔn)廣播(NormalBroadcasts)2.有序廣播(OrderedBroadcasts)1.標(biāo)準(zhǔn)廣播(NormalBroadcasts)它是一種完全異步執(zhí)行的廣播,當(dāng)該類廣播發(fā)送后,所有的廣播接收器(BroadcastReceiver)幾乎都會(huì)在同一時(shí)刻接收到它,這類廣播消息傳遞效率很高。但缺點(diǎn)是一個(gè)廣播接收器不能將它的處理結(jié)果傳遞給下一個(gè)廣播接收器,并且無(wú)法截?cái)嗾趥鬟f的廣播??墒褂肅ontext對(duì)象提供的sendBroadcast()方法用于發(fā)送標(biāo)準(zhǔn)廣播。2.有序廣播(OrderedBroadcasts)它是一種同步執(zhí)行的廣播,如果系統(tǒng)存在多個(gè)廣播接收器,當(dāng)該類廣播發(fā)送后,同一時(shí)刻只能有一個(gè)廣播接收器接收到它。只有當(dāng)這個(gè)廣播接收器的處理邏輯執(zhí)行完成,廣播才能繼續(xù)傳遞給下一個(gè)廣播接收器。此外,可為廣播接收器設(shè)置接收廣播的優(yōu)先級(jí),高優(yōu)先級(jí)的廣播接收器會(huì)首先接收到廣播消息,并且能夠截?cái)鄰V播向低優(yōu)先級(jí)廣播接收器傳遞。可使用Context對(duì)象提供的sendOrderedBroadcast()方法發(fā)送有序廣播。5.2

廣播的處理流程(整節(jié)替換)廣播的處理需要經(jīng)過(guò)消息發(fā)送、注冊(cè)BroadcastReceiver和消息處理三個(gè)主要環(huán)節(jié)。1.消息發(fā)送2.注冊(cè)BroadcastReceiver3.消息處理1.消息發(fā)送

廣播消息的本質(zhì)上是一個(gè)Intent對(duì)象。要發(fā)送一個(gè)廣播消息,首先把要發(fā)送的信息和相關(guān)的屬性信息(如action、category和extra等)封裝進(jìn)一個(gè)Intent對(duì)象,然后調(diào)用Context.sendBroadcast()或者sendOrderBroadcast()方法廣播該Intent對(duì)象即可。使用sendBroadcast()方法發(fā)出去的Intent,所有滿足條件的BroadcastReceiver都會(huì)隨機(jī)執(zhí)行其onReceive()方法;而由sendOrderBroadcast()發(fā)出去Intent,則會(huì)根據(jù)BroadcastReceiver注冊(cè)時(shí)IntentFilter設(shè)置的優(yōu)先級(jí)順序來(lái)執(zhí)行,相同優(yōu)先級(jí)的BroadcastReceiver則隨機(jī)執(zhí)行。

2.注冊(cè)BroadcastReceiverBroadcastReceiver用于接收應(yīng)用程序(包含系統(tǒng)內(nèi)置的應(yīng)用程序和第三方開(kāi)發(fā)的應(yīng)用程序)所發(fā)出的BroadcastIntent。作為應(yīng)用級(jí)組件,BroadcastReceiver必須經(jīng)過(guò)注冊(cè)才能夠處理廣播消息。注冊(cè)BroadcastReceiver有下述兩種方式。(1)使用Java代碼可調(diào)用BroadcastReceiver的registerReceiver()方法為BroadcastReceiver注冊(cè)Intent。例如,可使用下述代碼為BroadcastReceiver注冊(cè)監(jiān)聽(tīng)系統(tǒng)轉(zhuǎn)發(fā)的SMS消息。IntentFilterfilter=newIntentFilter(“vider.Telephony.SMS_RECEIVED”);IncomingSMSReceiverreceiver=newIncomingSMSReceiver();registerReceiver(receiver,filter);

(2)使用AndroidManifest.xml清單文件這種方法會(huì)在每次Broadcast事件發(fā)生后,自動(dòng)創(chuàng)建對(duì)其進(jìn)行處理的BroadcastReceiver對(duì)象,并自動(dòng)觸發(fā)該對(duì)象的onReceive()方法。例如,可為AndroidManifest.xml清單文件添加下述代碼,以處理SMS消息。<receiverandroid:name=”.IncomingSMSReceiver”><intent-filter><actionandroid:name=”vider.Telephony.SMS_RECEIVED”></intent-filter></receiver>3.消息處理當(dāng)廣播消息發(fā)送以后,所有已經(jīng)注冊(cè)的BroadcastReceiver會(huì)檢查注冊(cè)時(shí)的IntentFilter是否與發(fā)送的Intent相匹配,若匹配則就會(huì)調(diào)用BroadcastReceiver的onReceive()方法。由于BroadcastReceiver本質(zhì)上是一個(gè)監(jiān)聽(tīng)器。因此,需要重寫B(tài)roadcastReceiver的onReceive()方法以實(shí)現(xiàn)對(duì)廣播消息的處理。BroadcastReceiver的onReceive()方法執(zhí)行完成后,BroadcastReceiver對(duì)象就會(huì)被銷毀。如果onReceive()方法不能再10S內(nèi)執(zhí)行完成,Android系統(tǒng)會(huì)認(rèn)為應(yīng)用程序無(wú)響應(yīng)。5.3發(fā)送與接收自定義廣播廣播的處理需要經(jīng)過(guò)消息發(fā)送、注冊(cè)BroadcastReceiver和消息處理三個(gè)主要環(huán)節(jié)。1.消息發(fā)送2.注冊(cè)BroadcastReceiver3.消息處理5.3.1發(fā)送與接收標(biāo)準(zhǔn)廣播發(fā)送標(biāo)準(zhǔn)廣播只需調(diào)用Context的sendBroadcast(Intentintent)即可。這條廣播將啟動(dòng)intent參數(shù)所對(duì)應(yīng)的BroadcastReceiver。下面使用示例程序5.1說(shuō)明如何發(fā)送廣播以及如何使用BroadcastReceiver接收廣播。該程序的Activity只有一個(gè)按鈕,單擊該按鈕會(huì)向外發(fā)送一條廣播消息。發(fā)送廣播的代碼如下所示。publicclassMainActivityextendsActivity{ Buttonsend; @Override publicvoidonCreate(BundlesavedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); //獲取程序界面中的按鈕 send=(Button)findViewById(R.id.send); send.setOnClickListener(newOnClickListener() { @Override publicvoidonClick(Viewv) { //創(chuàng)建Intent對(duì)象 Intentintent=newIntent(); //設(shè)置Intent的Action屬性 intent.setAction("org.crazyit.action.CRAZY_BROADCAST"); intent.putExtra("msg","標(biāo)準(zhǔn)廣播"); //發(fā)送廣播 sendBroadcast(intent); }});}} 代碼解釋:粗體字標(biāo)記的代碼段給出了發(fā)送標(biāo)準(zhǔn)廣播的方法。可先創(chuàng)建封裝了廣播消息的Intent對(duì)象,再使用Activity的sendBroadcast()方法將廣播消息發(fā)送出去。為接收廣播消息,可使用下述代碼新建一個(gè)從BroadcastReceiver類繼承的子類,重寫父類的onReceive()方法,使用Toast對(duì)象將接收到的消息顯示出來(lái)。publicclassMyReceiverextendsBroadcastReceiver{ @Override publicvoidonReceive(Contextcontext,Intentintent) { Toast.makeText(context, "接收到的Intent的Action為:"+intent.getAction() +"\n消息內(nèi)容是:"+intent.getStringExtra("msg") ,Toast.LENGTH_LONG).show(); }}發(fā)送廣播消息時(shí)所用Intent的Action屬性是接收到的Intent的Action為:。為了監(jiān)聽(tīng)這個(gè)廣播消息,可在AndroidManifest.xml文清單件中,添加下述代碼,將廣播消息注冊(cè)給上文定義的BroadcastReceiver子類。 <receiverandroid:name=".MyReceiver"> <intent-filter> <!--指定該BroadcastReceiver所響應(yīng)的Intent的Action--> <actionandroid:name="org.crazyit.action.CRAZY_BROADCAST"/> </intent-filter> </receiver>編譯并程序,點(diǎn)擊“發(fā)送自定義廣播”按鈕,可以看到由Toast提示框顯示的廣播消息,如圖5-1所示。

圖5-1響應(yīng)廣播5.3.1發(fā)送與接收有序廣播對(duì)于有序廣播而言,Android系統(tǒng)會(huì)按照BroadcastReceiver聲明的優(yōu)先級(jí)順序依此對(duì)其派發(fā)。在廣播消息的傳遞過(guò)程中,高優(yōu)先級(jí)的BroadcastReceiver可以調(diào)用abortBroadcast()方法隨時(shí)終止廣播的向后傳遞。此外,高優(yōu)先級(jí)的BroadcastReceiver還可調(diào)用setResultExtras()方法將處理結(jié)果存儲(chǔ)到廣播消息中,然后,再由下一個(gè)BroadcastReceiver使用getResultExtras()方法取出存儲(chǔ)結(jié)果。下面使用示例程序5-2說(shuō)明如何發(fā)送廣播以及如何使用BroadcastReceiver接收廣播。該程序的Activity只有一個(gè)按鈕,單擊該按鈕會(huì)向外發(fā)送一條廣播消息。發(fā)送廣播的代碼如下所示。publicclassMainActivityextendsActivity{ Buttonsend; @Override publicvoidonCreate(BundlesavedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); //獲取程序中的send按鈕 send=(Button)findViewById(R.id.send); send.setOnClickListener(newOnClickListener() { @Override publicvoidonClick(Viewv) {

//創(chuàng)建Intent對(duì)象 Intentintent=newIntent(); intent.setAction("org.crazyit.action.CRAZY_BROADCAST"); intent.putExtra("msg","簡(jiǎn)單的消息"); //發(fā)送有序廣播 sendOrderedBroadcast(intent,null); }});}}代碼解釋:粗體字標(biāo)記的代碼段給出了發(fā)送有序廣播的方法??上葎?chuàng)建封裝了廣播消息的Intent對(duì)象,再使用Activity的sendOrderedBroadcast()方法將廣播消息發(fā)送出去。可使用下述代碼定義第一個(gè)接收廣播消息的BroadcastReceiver——MyReceiver。publicclassMyReceiverextendsBroadcastReceiver{ @Override publicvoidonReceive(Contextcontext,Intentintent){ Toast.makeText(context, "接收到的Intent的Action為:" +intent.getAction()+"\n消息內(nèi)容是:" +intent.getStringExtra("msg") ,Toast.LENGTH_LONG).show();

//創(chuàng)建一個(gè)Bundle對(duì)象,并存入數(shù)據(jù) Bundlebundle=newBundle(); bundle.putString("first","第一個(gè)BroadcastReceiver存入的消息"); //將bundle放入結(jié)果中 setResultExtras(bundle); //取消Broadcast的繼續(xù)傳播 //abortBroadcast(); }}代碼解釋:粗體字標(biāo)記的代碼段給出了向廣播中存儲(chǔ)數(shù)據(jù)的方法??墒褂肂undle對(duì)象存儲(chǔ)BroadcastReceiver的處理結(jié)果,然后使用setResultExtras()方法將Bundle對(duì)象附加到廣播消息中。這樣,當(dāng)廣播消息繼續(xù)向下傳遞時(shí),下一個(gè)BroadcastReceiver能夠?qū)⑵涮崛〕鰜?lái)了。此外,BroadcastReceiver可abortBroadcast()方法截?cái)鄰V播的向下傳遞(見(jiàn)代碼注釋)。為啟動(dòng)BroadcastReceiver監(jiān)聽(tīng)廣播消息,可在AndroidManifest.xml文清單件中,添加下述代碼,將廣播消息注冊(cè)給上文定義的BroadcastReceiver子類。此外,為優(yōu)先處理廣播消息,可設(shè)置android:priority屬性為BroadcastReceiver指定較高的優(yōu)先級(jí)。 <receiverandroid:name=".MyReceiver"> <intent-filterandroid:priority="20"> <actionandroid:name="org.crazyit.action.CRAZY_BROADCAST"/> </intent-filter> </receiver>接下來(lái),再使用下述代碼定義第二個(gè)接收廣播消息的BroadcastReceiver——MyReceiver2。publicclassMyReceiver2extendsBroadcastReceiver{ @Override publicvoidonReceive(Contextcontext,Intentintent) {

Bundlebundle=getResultExtras(true); //解析前一個(gè)BroadcastReceiver所存入的key為first的消息 Stringfirst=bundle.getString("first"); Toast.makeText(context,"第一個(gè)Broadcast存入的消息為:" +first,Toast.LENGTH_LONG).show(); }}代碼解釋:粗體字標(biāo)記的代碼段給出了從廣播消息中取出由上一個(gè)BroadcastReceiver存儲(chǔ)數(shù)據(jù)的方法。為啟動(dòng)MyReceiver2監(jiān)聽(tīng)廣播消息,可在AndroidManifest.xml文清單件中,添加下述代碼,將廣播消息注冊(cè)給上文定義的BroadcastReceiver子類。此外,可將BroadcastReceiver的android:priority屬性設(shè)置為較低優(yōu)先級(jí)。

<receiverandroid:name=".MyReceiver2"> <intent-filterandroid:priority="0"> <actionandroid:name="org.crazyit.action.CRAZY_BROADCAST"/> </intent-filter> </receiver>編譯并運(yùn)行程序,點(diǎn)擊“發(fā)送有序廣播”按鈕,可以先后看到由兩個(gè)BroadcastReceiver顯示出來(lái)的廣播消息內(nèi)容,如圖5-2所示。

圖5-2獲取前一個(gè)BroadcastReceiver存入結(jié)果中的消息5.4接收系統(tǒng)廣播在廣播消息中,有一類特殊的廣播,它們只能由Android系統(tǒng)發(fā)出。這類廣播消息稱為系統(tǒng)廣播。系統(tǒng)廣播被Android用來(lái)通知一些重要的系統(tǒng)事件。例如,當(dāng)電池電量發(fā)生變化時(shí)會(huì)發(fā)送一條廣播,時(shí)間或時(shí)區(qū)發(fā)生變化時(shí)會(huì)發(fā)送一條廣播,以及當(dāng)耳機(jī)插入或拔出時(shí)也會(huì)發(fā)送一條廣播等。系統(tǒng)廣播是若干定義在android.content.Intent中的Action常量,如表5-1所示。

表5-1系統(tǒng)廣播Action常量事件描述ACTION_TIME_TICK每分鐘被廣播一次,指示系統(tǒng)時(shí)間ACTION_TIME_CHANGED系統(tǒng)時(shí)間已修改ACTION_TIMEZONE_CHANGED系統(tǒng)時(shí)區(qū)已修改ACTION_BOOT_COMPLETED系統(tǒng)啟動(dòng)完成ACTION_PACKAGE_ADDED新應(yīng)用程序已安裝完成ACTION_PACKAGE_REMOVED應(yīng)用程序已卸載ACTION_PACKAGE_DATA_CLEARED應(yīng)用程序數(shù)據(jù)已清空ACTION_BATTERY_CHANGED電池電量發(fā)生變化ACTION_POWER_CONNECTED外部電源已接通ACTION_POWER_DISCONNECTED外部電源已斷開(kāi)ACTION_SHUTDOWN系統(tǒng)關(guān)閉SMS_RECEIVED新短信到達(dá)5.4.1開(kāi)機(jī)自動(dòng)運(yùn)行應(yīng)用程序?yàn)榱嗽O(shè)置應(yīng)用程序開(kāi)機(jī)自動(dòng)運(yùn)行,可以為應(yīng)用程序添加一個(gè)BroadcastReceiver。使用它監(jiān)聽(tīng)系統(tǒng)啟動(dòng)完成時(shí)發(fā)出的廣播消息。由表5-1可知,表示開(kāi)機(jī)廣播Intent的Action常量為ACTION_BOOT_COMPLETED。

可使用下述代碼定義一個(gè)BroadcastReceiver類,處理開(kāi)機(jī)廣播消息。

publicclassBootReceiverextendsBroadcastReceiver{@OverridepublicvoidonReceive(Contextcontext,Intentintent){

//創(chuàng)建IntentIntentactivityIntent=newIntent(context,MainActivity.class);//設(shè)置FlagactivityIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);context.startActivity(activityIntent);}}代碼解釋:粗體字標(biāo)記的代碼段給出了BroadcastReceiver對(duì)開(kāi)機(jī)廣播消息的處理邏輯。為打開(kāi)應(yīng)用程序的主界面,可以在重寫的onReceive()方法中創(chuàng)建了一個(gè)Intent對(duì)象,并使用該對(duì)象指定啟動(dòng)的Activity。需要注意的是,為避免了由于Activity啟動(dòng)時(shí)間過(guò)長(zhǎng)而引起的系統(tǒng)無(wú)響應(yīng)問(wèn)題,可以為activityIntent設(shè)置FLAG_ACTIVITY_NEW_TASK標(biāo)志,指示為新啟動(dòng)的Activity分配一個(gè)新的進(jìn)程。為啟動(dòng)上文定義的BootReceiver監(jiān)聽(tīng)開(kāi)機(jī)廣播,可在AndroidManifest.xml文清單件中,添加下述粗體字標(biāo)記的代碼。<receiverandroid:name=".BootReceiver"><intent-filter><actionandroid:name="ent.action.BOOT_COMPLETED"/></intent-filter></receiver>

除此之外,為了允許應(yīng)用程序能夠訪問(wèn)系統(tǒng)開(kāi)機(jī)事件,還需要為應(yīng)用程序增加關(guān)于如下權(quán)限的聲明。<!—授予應(yīng)用程序訪問(wèn)系統(tǒng)開(kāi)機(jī)事件的權(quán)限--><uses-permissionandroid:name="android.permission.RECEIVE_BOOT_COMPLETED"/>編譯并運(yùn)行應(yīng)用程序,然后重啟Android系統(tǒng)??梢钥吹疆?dāng)系統(tǒng)啟動(dòng)完成后,將自動(dòng)運(yùn)行并打開(kāi)應(yīng)用程序的主界面。5.4.2接收電池電量提示當(dāng)電池電量發(fā)生變化時(shí),系統(tǒng)會(huì)發(fā)送Action為ACTION_BATTERY_CHANGED的Intent廣播;當(dāng)電池電量過(guò)低時(shí),系統(tǒng)會(huì)發(fā)送Action為ACTION_BATTERY_LOW的Intent廣播??赏ㄟ^(guò)開(kāi)發(fā)監(jiān)聽(tīng)相應(yīng)廣播消息的BroadcastReceiver,為應(yīng)用程序增加電池電量提醒功能??墒褂孟率龃a定義一個(gè)BroadcastReceiver類,處理系統(tǒng)發(fā)出的電池電量變化廣播。publicclassBatteryReceiverextendsBroadcastReceiver{ @Override publicvoidonReceive(Contextcontext,Intentintent) { System.out.println("+++++++++++++++++++++++"); Bundlebundle=intent.getExtras(); //獲取當(dāng)前電池電量 intcurrent=bundle.getInt("level"); //獲取電池總電量 inttotal=bundle.getInt("scale"); //如果當(dāng)前電量小于總電量的15% if(current*1.0/total<0.15) { Toast.makeText(context,"電量過(guò)低,請(qǐng)盡快充電!" ,Toast.LENGTH_LONG).show(); }}為啟動(dòng)上文定義的BatteryReceiver監(jiān)聽(tīng)電池電量發(fā)生變化廣播,可在AndroidManifest.xml文清單件中,添加下述粗體字標(biāo)記的代碼。 <receiverandroid:name=".BatteryReceiver"> <!--監(jiān)聽(tīng)電池電量改變-->

<intent-filter> <actionandroid:name="ent.action.BATTERY_CHANGED"/> </intent-filter> </receiver>除此之外,為了允許應(yīng)用程序能夠訪問(wèn)電池電量變化事件,還需要為應(yīng)用程序增加關(guān)于如下權(quán)限的聲明。<!—授予應(yīng)用程序訪問(wèn)讀取電池電量--><uses-permissionandroid:name="android.permission.BATTERY_STATS"/>編譯并運(yùn)行應(yīng)用程序,可以看到當(dāng)電池電量小于設(shè)定的閾值后,應(yīng)用程序?qū)⒔o出電量過(guò)低提示。5.4.3接收短息提醒當(dāng)系統(tǒng)接收到短信時(shí),系統(tǒng)會(huì)發(fā)送一個(gè)Action為SMS_RECEIVED的Intent有序廣播??赏ㄟ^(guò)開(kāi)發(fā)監(jiān)聽(tīng)相應(yīng)廣播消息的BroadcastReceiver,為應(yīng)用程序增加短信提醒功能??墒褂孟率龃a定義一個(gè)BroadcastReceiver類,處理系統(tǒng)發(fā)出的新短信到達(dá)廣播。publicclassSmsReceiverextendsBroadcastReceiver{ //當(dāng)接收到短信時(shí)被觸發(fā) @Override publicvoidonReceive(Contextcontext,Intentintent) { //如果是接收到短信 if(intent.getAction().equals( "vider.Telephony.SMS_RECEIVED")) { //取消新短信到達(dá)廣播 abortBroadcast();StringBuildersb=newStringBuilder(); //接收由SMS傳過(guò)來(lái)的數(shù)據(jù) Bundlebundle=intent.getExtras(); //判斷是否有數(shù)據(jù) if(bundle!=null) { //通過(guò)pdus可以獲得接收到的所有短信消息 Object[]pdus=(Object[])bundle.get("pdus"); //構(gòu)建短信對(duì)象array,并依據(jù)收到的對(duì)象長(zhǎng)度來(lái)創(chuàng)建array的大小 SmsMessage[]messages=newSmsMessage[pdus.length]; for(inti=0;i<pdus.length;i++) { messages[i]=SmsMessage .createFromPdu((byte[])pdus[i]); }//將發(fā)送來(lái)的短信合并自定義信息于StringBuilder當(dāng)中 for(SmsMessagemessage:messages) { sb.append("短信來(lái)源:"); //獲得接收短信的電話號(hào)碼 sb.append(message.getDisplayOriginatingAddress()); sb.append("\n------短信內(nèi)容------\n"); //獲得短信的內(nèi)容 sb.append(message.getDisplayMessageBody()); } } Toast.makeText(context,sb.toString() ,Toast.LENGTH_LONG).show(); }}為啟動(dòng)上文定義的SmsReceiver監(jiān)聽(tīng)新短信到達(dá)廣播,并能夠讓應(yīng)用程序可在系統(tǒng)短信接收程序之前截獲短新,可在AndroidManifest.xml文清單件中,添加下述粗體字標(biāo)記的代碼。<receiverandroid:name="SmsReceiver">

<intent-filterandroid:priority="1000"> <actionandroid:name="vider.Telephony.SMS_RECEIVED"/> </intent-filter> </receiver>除此之外,為了允許應(yīng)用程序能夠讀取短信,還需要為應(yīng)用程序增加關(guān)于如下權(quán)限的聲明。<!—授予程序接收短信的權(quán)限--><uses-permissionandroid:name="android.permission.RECEIVE_SMS"/>編譯并運(yùn)行應(yīng)用程序,可以看到當(dāng)新短信到達(dá)系統(tǒng)后,應(yīng)用程序?qū)⒔o出短信提示。5.5使用本地廣播

前文介紹的所有廣播消息都是全局廣播,即由一個(gè)應(yīng)用程序發(fā)送的廣播消息都能夠被其它任何應(yīng)用程序接收,這很容易引發(fā)安全性問(wèn)題。例如,如果一個(gè)應(yīng)用程序發(fā)送的廣播攜帶有關(guān)鍵數(shù)據(jù),它極有可能被其它應(yīng)用程序截獲。為了能夠以一種簡(jiǎn)單的方式解決廣播的安全性問(wèn)題,Android引入了一套本地廣播機(jī)制。使用該機(jī)制發(fā)送的廣播只能在應(yīng)用程序的內(nèi)部進(jìn)行傳遞,并且BroadcastReceiver也只能接收來(lái)自本地應(yīng)用程序發(fā)送的廣播。為支持在應(yīng)用程序內(nèi)部使用本地廣播,Android提供了LocalBroadcastManager對(duì)其進(jìn)行管理,并提供了發(fā)送廣播和注冊(cè)BroadcastReceiver的方法??墒褂孟率龃a為應(yīng)用程序動(dòng)態(tài)注冊(cè)一個(gè)BroadcastReceiver對(duì)象,并在應(yīng)用程序內(nèi)部發(fā)送、接收廣播消息。publicclassMainActivityextendsAppCompatActivity{privateIntentFilterintentfilter;privateLocalReceiverlocalreceiver;privateLocalBroadcastManagerlocalbroadcastmanager;

@Override publicvoidonCreate(BundlesavedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main);//獲取LocalBroadcastManager對(duì)象

localbroadcastmanager=LocalBroadcastManager.getInstance(this); //獲取程序中的send按鈕 Buttonbutton=(Button)findViewById(R.id.send); button.setOnClickListener(newOnClickListener() { @Override publicvoidonClick(Viewv) {

//創(chuàng)建Intent對(duì)象 Intentintent=newIntent("com.example.broadcasttest.LOCAL_BROADCAST"); //發(fā)送本地廣播 localbroadcastmanager.sendBroadcast(intent); } });//注冊(cè)本地BroadcastReceiverintentfilter=newIntentFilter();intentfilter.addAction("com.example.broadcasttest.LOCAL_BROADCAST");localreceiver=newLocalReceiver();localbroadcastmanager.registerReceiver(localreceiver,intentfilter); }@Override protectedvoidonDestory() {super.onDestory();localbroadcastmanager.unr

溫馨提示

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

最新文檔

評(píng)論

0/150

提交評(píng)論