国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 系統 > Android > 正文

Android BroadcastReceiver廣播注冊方式總結

2019-12-12 04:03:10
字體:
來源:轉載
供稿:網友

Android:BroadcastReceiver注冊的方式分為兩種:

靜態注冊

動態注冊

1. 靜態注冊

在AndroidManifest.xml里通過標簽聲明

屬性說明:

<receiver   android:enabled=["true" | "false"]//此broadcastReceiver能否接收其他App的發出的廣播//默認值是由receiver中有無intent-filter決定的:如果有intent-filter,默認值為true,否則為false  android:exported=["true" | "false"]  android:icon="drawable resource"  android:label="string resource"http://繼承BroadcastReceiver子類的類名  android:name=".mBroadcastReceiver"http://具有相應權限的廣播發送者發送的廣播才能被此BroadcastReceiver所接收;  android:permission="string"http://BroadcastReceiver運行所處的進程//默認為app的進程,可以指定獨立的進程//注:Android四大基本組件都可以通過此屬性指定自己的獨立進程  android:process="string" >//用于指定此廣播接收器將接收的廣播類型//本示例中給出的是用于接收網絡狀態改變時發出的廣播 <intent-filter><action android:name="android.net.conn.CONNECTIVITY_CHANGE" />  </intent-filter></receiver>

注冊示例

<receiver   //此廣播接收者類是mBroadcastReceiver  android:name=".mBroadcastReceiver" >  //用于接收網絡狀態改變時發出的廣播  <intent-filter>    <action android:name="android.net.conn.CONNECTIVITY_CHANGE" />  </intent-filter></receiver>

當此App首次啟動時,系統會自動實例化mBroadcastReceiver類,并注冊到系統中。

2. 動態注冊

在代碼中通過調用Context的registerReceiver()方法進行動態注冊BroadcastReceiver,具體代碼如下:

@Override protected void onResume(){   super.onResume();  //實例化BroadcastReceiver子類 & IntentFilter   mBroadcastReceiver mBroadcastReceiver = new mBroadcastReceiver();   IntentFilter intentFilter = new IntentFilter();  //設置接收廣播的類型   intentFilter.addAction(android.net.conn.CONNECTIVITY_CHANGE);  //調用Context的registerReceiver()方法進行動態注冊   registerReceiver(mBroadcastReceiver, intentFilter); }//注冊廣播后,要在相應位置記得銷毀廣播//即在onPause() 中unregisterReceiver(mBroadcastReceiver)//當此Activity實例化時,會動態將MyBroadcastReceiver注冊到系統中//當此Activity銷毀時,動態注冊的MyBroadcastReceiver將不再接收到相應的廣播。 @Override protected void onPause() {   super.onPause();   //銷毀在onResume()方法中的廣播   unregisterReceiver(mBroadcastReceiver);   }}

3. 兩種注冊方式的區別

注冊方式的區別

4. 特別注意

動態廣播最好在Activity的onResume()注冊、onPause()注銷。

原因:

1.對于動態廣播,有注冊就必然得有注銷,否則會導致內存泄露

重復注冊、重復注銷也不允許

2.Activity生命周期如下:

Activity生命周期

Activity生命周期的方法是成對出現的:

- onCreate() & onDestory()
- onStart() & onStop()
- onResume() & onPause()

在onResume()注冊、onPause()注銷是因為onPause()在App死亡前一定會被執行,從而保證廣播在App死亡前一定會被注銷,從而防止內存泄露。

1.不在onCreate() & onDestory() 或 onStart() & onStop()注冊、注銷是因為:
當系統因為內存不足(優先級更高的應用需要內存,請看上圖紅框)要回收Activity占用的資源時,Activity在執行完onPause()方法后就會被銷毀,有些生命周期方法onStop(),onDestory()就不會執行。當再回到此Activity時,是從onCreate方法開始執行。
2.假設我們將廣播的注銷放在onStop(),onDestory()方法里的話,有可能在Activity被銷毀后還未執行onStop(),onDestory()方法,即廣播仍還未注銷,從而導致內存泄露。
3. 但是,onPause()一定會被執行,從而保證了廣播在App死亡前一定會被注銷,從而防止內存泄露。

感謝閱讀,希望能幫助到大家,謝謝大家對本站的支持!

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 喀喇沁旗| 株洲市| 布尔津县| 乌苏市| 娄烦县| 修水县| 株洲县| 密山市| 高雄市| 佛教| 亚东县| 社旗县| 长阳| 旌德县| 榕江县| 利辛县| 静宁县| 宁津县| 曲靖市| 齐齐哈尔市| 营山县| 甘谷县| 双柏县| 治多县| 锡林浩特市| 廊坊市| 固阳县| 武安市| 澳门| 伊吾县| 香河县| 阿勒泰市| 洛南县| 那坡县| 友谊县| 井研县| 淮安市| 枣阳市| 曲靖市| 成都市| 永寿县|