什麼是廣播?
在Android中,Broadcast是一種廣泛運用的在應用程序之間傳輸信息的機制。我們拿廣播電台來做個比方。我們平常使用收音機收音是這樣的:許許多多不同的廣播電台通過特定的頻率來發送他們的內容,而我們用戶只需要將頻率調成和廣播電台的一樣就可以收聽他們的內容了。Android中的廣播機制就和這個差不多的道理。
電台發送的內容是語音,而在Android中我們要發送的廣播內容是一個Intent。這個Intent中可以攜帶我們要傳送的數據。
電台通過大功率的發射器發送內容,而在Android中則是通過sendBroadcast這個方法來發送(很形象的名字吧)。
用戶通過調整到具體的電台頻率接受電台的內容。而在Android中要接受廣播中的內容則是通過注冊一個BroadCastReceiver來接收的。只有發送廣播的action和接收廣播的action相同,接受者才能接受這個廣播。
廣播有什麼用?
其實,在什麼是廣播的第一句就已經說明了廣播有什麼用了。對了,籠統一點講就是用來傳輸數據的。具體一點說就是:
1.實現了不同的程序之間的數據傳輸與共享,因為只要是和發送廣播的action相同的接受者都能接受這個廣播。典型的應用就是android自帶的短信,電話等等廣播,只要我們實現了他們的action的廣播,那麼我們就能接收他們的數據了,以便做出一些處理。比如說攔截系統短信,攔截騷擾電話等等
2.起到了一個通知的作用,比如在service中要通知主程序,更新主程序的UI等。因為service是沒有界面的,所以不能直接獲得主程序中的控件,這樣我們就只能在主程序中實現一個廣播接受者專門用來接受service發過來的數據和通知了。
Android廣播機制包含三個基本要素:
廣播(Broadcast)----- 用於發送廣播。
廣播接收器(BroadcastReceiver)----- 用於接收廣播。
意圖內容(Intent)----- 用於保存廣播相關信息的媒介。
Broadcast是一種廣泛應用的在應用程序之間傳輸信息的機制。而BroadcastReceiver是對發出來的Broadcast進行過濾接受並響應的組件。
下面對廣播的過程進行詳細的描述:
首先在需要發送信息的地方,把要發送的信息和用於過濾的信息(如Action、Category)裝入一個Intent對象,然後通過調用Context.sendBroadcast()、Context.sendOrderBroadcast()或Context.sendstickyBroadcast()方法,把Intent對象以廣播的方式發出去。
當Intent發送以後,所有已經注冊的BroadcastReceiver會檢查注冊時的Intentfilter是否與發送的Intent相匹配,若匹配就會調用BroadcastReceiver的void onReceive(Context curContext, Intent broadcastMsg)方法。
廣播的生命周期:
廣播接收器僅在它執行這個方法時處於活躍狀態。當onRecever()返回後,它就變為失活狀態。
擁有一個活躍狀態的廣播接收器的進程被保護起來不會被殺死,但僅擁有失活狀態組件的進程則會在其他進程需要它所占用的內存時被殺死。所以,如果響應一個廣播信息需要很長一段時間,我們一般會將其納入一個衍生的線程中去完成,而不是在主線程中去完成它,從而保證用戶交互過程的流暢性。
注冊BroadcastReceiver的兩種方法:
方式一,靜態的在AndroidManifest.xml中用<receiver>標簽聲明注冊,並在標簽內用<intent-filter>標簽注冊過濾器。
方式二,動態地在代碼中先定義並設置好一個IntentFilter對象,然後在需要注冊的地方調用Context.registerReceiver()方法,如果取消時就調用Context.unregisterReceiver()方法。如果用動態方式注冊的BroadcastReceiver的Context對象被銷毀時,BroadcastReceiver也就自動取消注冊了。
另外,若在使用sendBroadcast()的方法是指定了接收權限,則只有在AndroidManifest.xml中用<uses-permission>標簽聲明了擁有此權限的BroadcastReceiver才會有可能接收到發送來的Broadcast。同樣,若在注冊BroadcastReceiver時指定了可接收的Broadcast的權限,則只有在保內的AndroidManifest.xml中用<uses-permission>標簽聲明了,擁有此權限的Context對象所發送的Broadcast才能被這個BroadcastReceiver接收。
動態注冊:
IntentFilter intentFilter = new IntentFilter();
intentFilter.add(Action); //為BroadcastReceiver指定action,使之用於接收同action的廣播。
registerReceiver(BroadcastReceiver, intentFilter);
一般在onStart()中注冊,onStop()中取消。指定廣播目標Action:Intent intent = new Intent(action--String),指定了此action的receiver會接收此廣播。