Android倆種級別的監聽器

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啓動的子線程不能執行完成。

兩種廣播:普通廣播和有序廣播。

發送廣播:

 

    

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章