什么是廣播适贸?
用于監(jiān)聽或接收系統(tǒng)和應(yīng)用發(fā)出的廣播消息愕掏,并做出響應(yīng)物遇,因此廣播分為兩個角色:廣播發(fā)送者俩功、廣播接收者绍傲。
接收廣播的分類
- 普通廣播:
使用sendBroadcast()方法發(fā)送扔傅, 他們是完全異步的,廣播的全部接收者以未定義的順序運行烫饼,通常在同一時間猎塞,這種方法非常高效,但是接收者不能使用結(jié)果或者終止API杠纵。 - 有序廣播:
使用sendOrderedBroadcast()方法發(fā)送荠耽,他們每次只發(fā)送給一個接收者,由于每個接收者依次運行比藻,它能為下一個接收者生成一個結(jié)果铝量,或者它能完全終止廣播以便不傳遞給其他接收者倘屹,有序接收者運行順序由匹配的intent-filter的android:priority屬性控制,具有相同優(yōu)先級的接收者運行順序隨機慢叨。 - 系統(tǒng)廣播
- 粘性廣播
注冊與注銷
BroadcastReceiver的注冊與注銷推薦在OnStart()纽匙、OnStop()中進行。
廣播的注冊機制
靜態(tài)注冊:
在AndroidManifest.xml中用標(biāo)簽注冊拍谐,并在標(biāo)簽內(nèi)用標(biāo)簽設(shè)置過濾器烛缔。
靜態(tài)注冊為常駐型廣播,也就是說如果應(yīng)用程序關(guān)閉了轩拨,有相應(yīng)事件觸發(fā)程序還是會響應(yīng)践瓷。動態(tài)注冊:
registerReceiver()。
動態(tài)注冊為非常駐型廣播气嫁,即它會跟隨Activity的生命周期当窗,所以在Activity結(jié)束前我們需要主動撤銷注冊否則會出現(xiàn)異常。-
區(qū)別:
靜態(tài)注冊時
執(zhí)行完onReceive()方法寸宵,BroadcastReceiver對象的生命周期就已經(jīng)到頭了崖面。因此不能在onReceive()中進行異步操作, 有可能異步操作還沒完成,BroadcastReceiver所在的進程就被kill了梯影。同樣巫员,成員變量無法保存它們的值,它們每次都是重新創(chuàng)建的, 之前的已經(jīng)隨著BroadcastReceiver對象被銷毀了.甲棍。 某些情況下(進程不會被kill的)是可以用static變量的简识。動態(tài)注冊時
BroadcastReceiver的成員變量是可用的, BroadcastReceiver對象的生命周期是可控的。每次收到廣播都是使用我們registerReceiver()時傳入的對象處理的感猛。 當(dāng)然, 此時靜態(tài)變量也是可用的七扰。
注意:通過這種方式注冊的廣播為非常駐型廣播,即它會跟隨Activity的生命周期陪白,所以在Activity結(jié)束前我們需要調(diào)用unregisterReceiver()方法移除它颈走。