編輯:關於Android編程
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" //繼承BroadcastReceiver子類的類名 android:name=".mBroadcastReceiver" //具有相應權限的廣播發送者發送的廣播才能被此BroadcastReceiver所接收; android:permission="string" //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生命周期的方法是成對出現的:
- 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死亡前一定會被注銷,從而防止內存洩露。
感謝閱讀,希望能幫助到大家,謝謝大家對本站的支持!
自從Fragment出現,曾經有段時間,感覺大家談什麼都能跟Fragment談上關系,做什麼都要問下Fragment能實現不~~~哈哈,是不是有點過~~~ 本篇博客力求為
Android實現功能:Listview嵌套viewpager仿淘寶搜狐視頻主頁面,和listview的下拉刷新。直接上圖下面給出我源碼的主要文件構成:MyListVie
第7節 豎屏的播放界面播放視頻的功能放在一個單獨的Activity當中。我們將為它們設置橫豎屏兩種布局。在豎屏的時候,上半部分播放視頻,下半部分顯示視頻信息;
說明:android的線程使用。android的線程無非就是Main Thread和Worker Thread。(除了主線程Main Thread之外的其他線程都是Wor