Android BroadcastReceiver廣播注冊方式總結(jié)
Android:BroadcastReceiver注冊的方式分為兩種:
靜態(tài)注冊
動態(tài)注冊
1. 靜態(tài)注冊
在AndroidManifest.xml里通過標(biāo)簽聲明
屬性說明:
<receiver android:enabled=["true" | "false"] //此broadcastReceiver能否接收其他App的發(fā)出的廣播 //默認(rèn)值是由receiver中有無intent-filter決定的:如果有intent-filter,默認(rèn)值為true,否則為false android:exported=["true" | "false"] android:icon="drawable resource" android:label="string resource" //繼承BroadcastReceiver子類的類名 android:name=".mBroadcastReceiver" //具有相應(yīng)權(quán)限的廣播發(fā)送者發(fā)送的廣播才能被此BroadcastReceiver所接收; android:permission="string" //BroadcastReceiver運(yùn)行所處的進(jìn)程 //默認(rèn)為app的進(jìn)程,可以指定獨立的進(jìn)程 //注:Android四大基本組件都可以通過此屬性指定自己的獨立進(jìn)程 android:process="string" > //用于指定此廣播接收器將接收的廣播類型 //本示例中給出的是用于接收網(wǎng)絡(luò)狀態(tài)改變時發(fā)出的廣播 <intent-filter> <action android:name="android.net.conn.CONNECTIVITY_CHANGE" /> </intent-filter> </receiver>
注冊示例
<receiver
//此廣播接收者類是mBroadcastReceiver
android:name=".mBroadcastReceiver" >
//用于接收網(wǎng)絡(luò)狀態(tài)改變時發(fā)出的廣播
<intent-filter>
<action android:name="android.net.conn.CONNECTIVITY_CHANGE" />
</intent-filter>
</receiver>
當(dāng)此App首次啟動時,系統(tǒng)會自動實例化mBroadcastReceiver類,并注冊到系統(tǒng)中。
2. 動態(tài)注冊
在代碼中通過調(diào)用Context的registerReceiver()方法進(jìn)行動態(tài)注冊BroadcastReceiver,具體代碼如下:
@Override
protected void onResume(){
super.onResume();
//實例化BroadcastReceiver子類 & IntentFilter
mBroadcastReceiver mBroadcastReceiver = new mBroadcastReceiver();
IntentFilter intentFilter = new IntentFilter();
//設(shè)置接收廣播的類型
intentFilter.addAction(android.net.conn.CONNECTIVITY_CHANGE);
//調(diào)用Context的registerReceiver()方法進(jìn)行動態(tài)注冊
registerReceiver(mBroadcastReceiver, intentFilter);
}
//注冊廣播后,要在相應(yīng)位置記得銷毀廣播
//即在onPause() 中unregisterReceiver(mBroadcastReceiver)
//當(dāng)此Activity實例化時,會動態(tài)將MyBroadcastReceiver注冊到系統(tǒng)中
//當(dāng)此Activity銷毀時,動態(tài)注冊的MyBroadcastReceiver將不再接收到相應(yīng)的廣播。
@Override
protected void onPause() {
super.onPause();
//銷毀在onResume()方法中的廣播
unregisterReceiver(mBroadcastReceiver);
}
}
3. 兩種注冊方式的區(qū)別

4. 特別注意
動態(tài)廣播最好在Activity的onResume()注冊、onPause()注銷。
原因:
1.對于動態(tài)廣播,有注冊就必然得有注銷,否則會導(dǎo)致內(nèi)存泄露
重復(fù)注冊、重復(fù)注銷也不允許
2.Activity生命周期如下:

Activity生命周期的方法是成對出現(xiàn)的:
- onCreate() & onDestory()
- onStart() & onStop()
- onResume() & onPause()
在onResume()注冊、onPause()注銷是因為onPause()在App死亡前一定會被執(zhí)行,從而保證廣播在App死亡前一定會被注銷,從而防止內(nèi)存泄露。
1.不在onCreate() & onDestory() 或 onStart() & onStop()注冊、注銷是因為:
當(dāng)系統(tǒng)因為內(nèi)存不足(優(yōu)先級更高的應(yīng)用需要內(nèi)存,請看上圖紅框)要回收Activity占用的資源時,Activity在執(zhí)行完onPause()方法后就會被銷毀,有些生命周期方法onStop(),onDestory()就不會執(zhí)行。當(dāng)再回到此Activity時,是從onCreate方法開始執(zhí)行。
2.假設(shè)我們將廣播的注銷放在onStop(),onDestory()方法里的話,有可能在Activity被銷毀后還未執(zhí)行onStop(),onDestory()方法,即廣播仍還未注銷,從而導(dǎo)致內(nèi)存泄露。
3. 但是,onPause()一定會被執(zhí)行,從而保證了廣播在App死亡前一定會被注銷,從而防止內(nèi)存泄露。
感謝閱讀,希望能幫助到大家,謝謝大家對本站的支持!
相關(guān)文章
Android HorizontalScrollView左右滑動效果
這篇文章主要為大家詳細(xì)介紹了Android HorizontalScrollView左右滑動效果的相關(guān)資料,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-02-02
淺談Android為RecyclerView增加監(jiān)聽以及數(shù)據(jù)混亂的小坑
下面小編就為大家?guī)硪黄獪\談Android為RecyclerView增加監(jiān)聽以及數(shù)據(jù)混亂的小坑。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-04-04
Flutter Http網(wǎng)絡(luò)請求實現(xiàn)詳解
這篇文章主要介紹了Flutter Http網(wǎng)絡(luò)請求實現(xiàn)詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-04-04
Android 四種動畫效果的調(diào)用實現(xiàn)代碼
在這里, 我將每種動畫分別應(yīng)用于四個按鈕為例,需要的朋友可以參考下2013-01-01
Android中EditText實現(xiàn)不可編輯解決辦法
這篇文章主要介紹了Android中EditText實現(xiàn)不可編輯解決辦法,需要的朋友可以參考下2014-12-12
Android實現(xiàn)單頁面浮層可拖動view的示例代碼
本篇文章主要介紹了Android實現(xiàn)單頁面浮層可拖動view的示例代碼,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-10-10

