一招盲、BroadcastReceiver是什么愿题。
Android應(yīng)用程序可以發(fā)送或接收來自Android系統(tǒng)和其他Android應(yīng)用程序的廣播消息免胃,類似于發(fā)布訂閱設(shè)計(jì)模式粉楚。例如辣恋,當(dāng)各種系統(tǒng)事件發(fā)生時(shí),例如系統(tǒng)啟動(dòng)或設(shè)備開始充電時(shí)模软,Android系統(tǒng)會(huì)發(fā)送廣播伟骨。應(yīng)用程序還可以發(fā)送自定義廣播,例如燃异,通知其他應(yīng)用程序可能感興趣的內(nèi)容(例如携狭,一些新數(shù)據(jù)已被下載)。
應(yīng)用程序可以注冊(cè)以接收特定的廣播回俐。當(dāng)發(fā)送廣播時(shí)暑中,系統(tǒng)自動(dòng)將廣播路由到已訂閱接收該特定類型的廣播的應(yīng)用。
一般來說鲫剿,廣播可以用作跨應(yīng)用程序和正常用戶流之外的消息傳遞系統(tǒng)鳄逾。
系統(tǒng)廣播
當(dāng)系統(tǒng)發(fā)生各種系統(tǒng)事件時(shí),系統(tǒng)會(huì)自動(dòng)發(fā)送廣播灵莲,例如系統(tǒng)切換飛機(jī)模式時(shí)雕凹。系統(tǒng)廣播將發(fā)送到訂閱接收事件的所有應(yīng)用程序。
廣播消息本身被包裹在Intent其動(dòng)作字符串識(shí)別發(fā)生的事件的對(duì)象(例如android.intent.action.AIRPLANE_MODE)中。該意圖還可以包括捆綁到其額外字段中的附加信息枚抵。例如线欲,飛機(jī)模式意圖包括一個(gè)布爾值,表示飛機(jī)模式是否打開汽摹。
二李丰、接收廣播
應(yīng)用程序可以通過兩種方式接收廣播:通過清單聲明注冊(cè)和上下文注冊(cè)。
清單聲明注冊(cè)
1逼泣、指定應(yīng)用程式清單中的<reveiver>元素趴泌。
2、子類BroadcastReceiver和實(shí)現(xiàn)onReceiver(Context context,Intent intent)拉庶。以下示例中的廣播接收器記錄并顯示廣播的內(nèi)容:
上下文注冊(cè)
1嗜憔、創(chuàng)建一個(gè)實(shí)例BroadcastReceiver。
BroadcastReceiverbr=newMyBroadcastReceiver();
2氏仗、創(chuàng)建Intentfilter并通過調(diào)用注冊(cè)接收方RegisterReceiver(BroadcastReceiver 吉捶, IntentFilter);
IntentFilterfilter=newIntentFilter(ConnectivityManager.CONNECTIVITY_ACTION);
intentFilter.addAction(Intent.ACTION_AIRPLANE_MODE_CHANGED);
this.registerReceiver(br,filter);
3皆尔、要停止接收廣播呐舔,請(qǐng)注銷unregisterReceiver(android.content.BroadcastReceiver)。當(dāng)您不再需要它或上下文不再有效時(shí)慷蠕,請(qǐng)務(wù)必注銷接收器滋早。
注意在哪里注冊(cè)和注銷接收者,例如砌们,如果您在onCreate(Bundle)使用活動(dòng)的上下文中注冊(cè)接收方杆麸,則應(yīng)該取消注冊(cè),onDestory()以防止將接收者從活動(dòng)上下文泄漏出來浪感。如果您在其中注冊(cè)了一個(gè)接收器onResume()昔头,您應(yīng)該取消注冊(cè),onPause()以防止多次注冊(cè)(如果您不想在暫停時(shí)接收廣播影兽,并且可以減少不必要的系統(tǒng)開銷)揭斧。不要注銷onSaveInstanceState(Bundle),因?yàn)槿绻脩粼跉v史堆棧中移回峻堰,則不會(huì)調(diào)用它讹开。
三、發(fā)送廣播
1捐名、sendOrderedBroadcast(Intent旦万,String)方法一次向一個(gè)接收器發(fā)送廣播。隨著每個(gè)接收機(jī)依次執(zhí)行镶蹋,它可以將結(jié)果傳播到下一個(gè)接收機(jī)成艘,或者它可以完全中止廣播赏半,使得它不會(huì)被傳遞到其他接收機(jī)。運(yùn)行的訂單接收器可以通過匹配的意圖過濾器的android:priority屬性來控制;具有相同優(yōu)先級(jí)的接收器將以任意順序運(yùn)行淆两。
2断箫、sendBroadcast(Intent)方法以未定義的順序向所有接收者發(fā)送廣播。這被稱為普通廣播秋冰。這更有效率仲义,但是意味著接收機(jī)不能從其他接收機(jī)讀取結(jié)果,傳播從廣播接收到的數(shù)據(jù)剑勾,或者中止廣播埃撵。
3、LocalBroadcastManger.sendBroadcast()方法向與發(fā)送方相同的應(yīng)用程序的接收方發(fā)送廣播甥材。如果您不需要跨應(yīng)用發(fā)送廣播,請(qǐng)使用本地廣播性含。實(shí)施效率更高(無需進(jìn)行進(jìn)程間通信)洲赵,您無需擔(dān)心與能夠接收或發(fā)送廣播的其他應(yīng)用程序相關(guān)的任何安全問題。
四商蕴、接收權(quán)限
如果您在注冊(cè)廣播接收者時(shí)指定了權(quán)限參數(shù)(與清單registerReceiver(BroadcastReceiver, IntentFilter, String, Handler)中的標(biāo)簽一起使用)叠萍,則只有通過其清單中的標(biāo)簽請(qǐng)求許可的廣播商才能發(fā)送接收器的意圖。
例如绪商,假設(shè)您的接收應(yīng)用程序具有清單聲明的接收器苛谷,如下所示:
或者您的接收應(yīng)用程序具有上下文注冊(cè)的接收器,如下所示:
安全考慮和最佳做法