在Android中,有壹些操作完成以後,會發送廣播,比如說發出壹條短信,或打出壹個電話,如果某個程序接收了這個廣播,就會做相應的處理。這個廣播跟我們傳統意義中的電臺廣播有些相似之處。之所以叫做廣播,就是因為它只負責“說”而不管妳“聽不聽”,也就是不管妳接收方如何處理。另外,廣播可以被不只壹個應用程序所接收,當然也可能不被任何應用程序所接收。
廣播機制最大的特點就是發送方並不關心接收方是否接到數據,也不關心接收方是如何處理數據的。
Android中廣播的是操作系統中產生的各種各樣的事件。例如,收到壹條短信就會產生壹個收到短信息的事件。而Android操作系統壹旦內部產生了這些事件,就會向所有的廣播接收器對象來廣播這些事件。
1.1 廣播接收器BroadcastReceiver
BroadcastReceiver(廣播接收器)是為了實現系統廣播而提供的壹種組件,並且廣播事件處理機制是系統級別的。比如,我們可以發出壹種廣播來測試是否收到短信,這時候就可以定義壹個BraodcastReceiver來接受廣播,當收到短信時提示用戶。我們既可以用Intent來啟動壹個組件,也可以用sendBroadcast()方法發起壹個系統級別的事件廣播來傳遞消息。
我們也可以在自己的應用程序中開發BroadcastReceiver,然後把廣播接收器這個類或者對象註冊到Android操作系統上去,讓操作系統知道現在有這樣壹個廣播接收器正在等待接收Android操作系統的廣播,即在自己的應用程序中實現BroadcastReceiver來監聽和響應廣播的Intent。
當有廣播事件產生時,Android操作系統首先告訴註冊到其上面的廣播接收器產生了壹個怎麽樣的事件,每個接收器首先判斷是不是我這個接收器需要的事件,如果是它所需要的事件,再進行相應的處理。
例子,我們把騷擾電話的黑名單放到數據庫中去,當接到電話時會產生壹個接電話事件,事先在Android操作系統中註冊壹個BroadcastReceiver的對象,當產生事件的時候,會通知我們的廣播接收器對象,接收器對象接收到消息之後,就會到數據庫裏面去取所有黑名單電話和接到的這個電話號碼進行比較,如果匹配就直接掛掉。
1.2 註冊BroadcastReceiver的方法
BroadcastReceiver用於監聽被廣播的事件(Intent),為了達到這個目的,BroadcastReceiver必須進行註冊,註冊的方法有以下兩種:
1.靜態註冊
靜態註冊方式是在AndroidManifest.xml的application裏面定義receiver並設置要接收的action。
靜態註冊方式的特點:不管該應用程序是否處於活動狀態,都會進行監聽。
<receiver android:name=MyReceiver>
<intent-filter>
<action android:name=MyReceiver_Action/>
</intent-filter>
</receiver>
其中,MyReceiver為繼承BroadcastReceiver的類,重寫了onReceiver方法,並在onReceiver方法中對廣播進行處理。<intent-filter>標簽設置過濾器,接收指定action廣播。
2.動態註冊
動態註冊方式在activity裏面調用函數來註冊,和靜態的內容差不多。壹個形參是receiver,另壹個是IntentFilter,其中裏面是要接收的action。
動態註冊方式特點:在代碼中進行註冊後,當應用程序關閉後,就不再進行監聽。
MyReceiver receiver = new MyReceiver();
//創建過濾器,並指定action,使之用於接收同action的廣播
IntentFilter filter = new IntentFilter(MyReceiver_Action);
//註冊廣播接收器
registerReceiver(receiver, filter); // 指定廣播目標Action
Intent intent = new Intent(MyReceiver_Action);
// 可通過Intent攜帶消息
intent.putExtra(msg, 發送廣播);
// 發送廣播消息
sendBroadcast(intent); //註銷廣播接收器
unregisterReceiver(receiver);
註:
1.壹般在onStart中註冊BroadcastReceiver,在onStop中取消BroadcastReceiver。
2.壹個BroadcastReceiver 對象只有在被調用onReceive(Context, Intent)時才有效,當從該函數返回後,該對象就無效的了,結束生命周期。