Android 系統提供了兩種類型的監聽器,一種是OnXxxListener程序級別的監聽器,這類監聽器運行在指定程序所在進程中,當程序退出時,OnXxxListener監聽器也就隨之關閉了。一種是BroadcastReciver系統級別的監聽器,他擁有自己的進程,只要存在與之匹配的Inten被t廣播出來,BroadcastReciver總會被激發。
BroadcastReciver用於接收程序(包括用戶開發的程序和系統內建的程序)所發出的Broadcast Intent,它的啓動與Activity、Service 相同,只需兩步:
1、創建需要啓動的BroadcastReciver的Intent;
2、調用Context的sendBroadcast()活sendOrderdBroadcast()方法來啓動指定的BroadcastReciver。
當應用程序發出一個Broadcast Intent之後,所有匹配該intent的BroadcastReciver都有可能被啓動。
要實現BroadcastReciver的方法,只需繼承BroadcastReciver並重寫onReceive(Context context, Intent intent)方法即可。
一旦實現了BroadcastReceiver,接下來就應該指定該BroadcastReceiver能匹配的intent,有以下倆種方式:
1、代碼指定,調用BroadcastReceiver的Context的registerReceiver(myBroadCastReciver, iFilter),如下代碼;
IntentFilter iFilter = new IntentFilter("android.provider.Telephony.SMS_RECEIVED");
MyBroadCastReciver myBroadCastReciver = new MyBroadCastReciver();
registerReceiver(myBroadCastReciver, iFilter);
2、在AndroidManifest.xml文件中配置,如下代碼:
<receiver android:name=".MyBroadCastReciver">
<intent-filter>
<action android:name="android.provider.Telephony.SMS_RECEIVED"/>
</intent-filter>
</receiver>
每次系統Broadcast事件發生後,系統就會創建對應BroadcastReceiver的實例,並自動觸發他的onReceive(Context context, Intent intent)方法,onReceive(Context context, Intent intent)方法執行完畢,BroadcastReceiver的實例就會被銷燬。
如果BroadcastReceiver的onReceiver()方法不能在10秒內執行完成,Android會認爲該程序無響應。故不要在BroadcastReceiver的onReceiver()方法裏執行一些耗時的操作,否則會彈出ANR對話框。
如果確實需要根據Broadcast來完成一些耗時的操作,則可考慮通過Intent啓動一個Service來完成該操作。不應考慮使用新線程去完成耗時的操作,應爲BroadcastReceiver本身的生命週期很短,可能出現的情況是子線程還沒結束,BroadcastReceiver就已經退出了。
如果BroadcastReceiver所在的進程結束,雖然該進程內還有用戶啓動的新線程,但由於該進程內不包含任何活動組件,因此係統可能在內存緊張時優先結束該進程。這樣就可能導致BroadcastReceiver啓動的子線程不能執行完成。
兩種廣播:普通廣播和有序廣播。
發送廣播: