標籤:
本文轉自 http://www.cnblogs.com/qianlifeng/archive/2011/03/06/1972305.html
什麼是廣播
在Android中,Broadcast是一種廣泛運用的在應用程式之間傳輸資訊的機制。我們拿廣播電台來做個比方。我們平常使用收音機收音是這樣的:許許多多不同的廣播電台通過特定的頻率來發送他們的內容,而我們使用者只需要將頻率調成和廣播電台的一樣就可以收聽他們的內容了。Android中的廣播機制就和這個差不多的道理。
電台發送的內容是語音,而在Android中我們要發送的廣播內容是一個Intent。這個Intent中可以攜帶我們要傳送的資料。
電台通過大功率的發射器發送內容,而在Android中則是通過sendBroadcast這個方法來發送(很形象的名字吧)。
使用者通過調整到具體的電台頻率接受電台的內容。而在Android中要接受廣播中的內容則是通過註冊一個BroadCastReceiver來接收的。只有發送廣播的action和接收廣播的action相同,接受者才能接受這個廣播。
廣播有什麼用 其實,在什麼是廣播的第一句就已經說明了廣播有什麼用了。對了,籠統一點講就是用來傳輸資料的。具體一點說就是: 1.實現了不同的程式之間的資料轉送與共用,因為只要是和發送廣播的action相同的接受者都能接受這個廣播。典型的應用就是android內建的簡訊,電話等等廣播,只要我們實現了他們的action的廣播,那麼我們就能接收他們的資料了,以便做出一些處理。比如說攔截系統簡訊,攔截騷擾電話等等 2.起到了一個通知的作用,比如在service中要通知主程式,更新主程式的UI等。因為service是沒有介面的,所以不能直接獲得主程式中的控制項,這樣我們就只能在主程式中實現一個廣播接受者專門用來接受service發過來的資料和通知了。實現廣播
現在我們就來實現一個簡單的廣播程式。Android提供了兩種註冊廣播接受者的形式,分別是在程式中動態註冊和在xml中指定。他們之間的區別就是作用的範圍不同,程式動態註冊的接收者只在程式運行過程中有效,而在xml註冊的接收者不管你的程式有沒有啟動有會起作用。首先介紹在程式中動態註冊的方式。
動態註冊方式
我們在程式中設定了三個按鈕,分別是“註冊廣播”,“取消註冊”和“發送廣播”。然後每個按鈕設定點擊事件來完成廣播的示範。
最簡單的項目的建立過程和按鈕事件的建立我再這裡就不羅嗦了,不會的可以下載下面的DEMO源碼查看。直接看三個按鈕的實現方式。
首先是註冊廣播的按鈕事件代碼:
| 123456789101112131415161718192021222324252627 |
private ReceiveBroadCast receiveBroadCast; //廣播執行個體 public class RegisteLinster implements OnClickListener{ @Override public void onClick(View view) { // 註冊廣播接收 receiveBroadCast = new ReceiveBroadCast(); IntentFilter filter = new IntentFilter(); filter.addAction(flag); //只有持有相同的action的接受者才能接收此廣播 registerReceiver(receiveBroadCast, filter); }} public class ReceiveBroadCast extends BroadcastReceiver{ @Override public void onReceive(Context context, Intent intent) { //得到廣播中得到的資料,並顯示出來 String message = intent.getStringExtra("data"); txtShow.setText(message); } } |
首先我們實現了一個ReceiveBroadCast 類,它繼承了BroadcastReceiver並實現了其中的onReceive方法,這樣當這個廣播被接收的時候就會執行這個方法。注意我們在註冊廣播的時候使用了filter.addAction方法添加了一個過濾器。如果沒有這一句,就相當於廣播電台沒有告訴咱們收音機使用者接收的頻率,就不好收聽這個廣播了。
再來看看如何取消註冊,是的程式不再接收這個類型的廣播了。
| 123456789 |
public class UnregisteLinster implements OnClickListener{ @Override public void onClick(View arg0) { unregisterReceiver(receiveBroadCast); }} |
怎麼樣?是不是超級簡單的啊,就是將我們上面的那個廣播類的執行個體傳進去就行了。現在註冊,取消註冊都好了,就剩下如何發送了。看代碼:
| 1234567891011 |
public class SendBroadCastListener implements OnClickListener{ @Override public void onClick(View arg0) { Intent intent = new Intent(); //Itent就是我們要發送的內容 intent.putExtra("data", "this is data from broadcast "+Calendar.getInstance().get(Calendar.SECOND)); intent.setAction(flag); //設定你這個廣播的action,只有和這個action一樣的接受者才能接受者才能接收廣播 sendBroadcast(intent); //發送廣播 }} |
每一句都注釋了的,就不要我再講了吧。一看就明白了。現在,運行程式看看效果吧。先註冊一下,然後每發送一次廣播上面的文字就會變化一次,表明已經接收到了廣播了。按取消註冊後你可以發現再按發送按鈕已經接收不到廣播了。
設定檔方式
配置和動態註冊的區別在上面已經說了,這種方式適合你的程式需要長期的監測某個廣播的情形,比如監測使用者的簡訊。註冊方式比較簡單,相當於上面的代碼只要接收的那部分就行了。不過要注意的是通過設定檔這種方式註冊廣播需要在單獨的一個類中繼承BroadReceiver,內部類是沒有用的。所以我們建立了一個broadCastReceiveByXml類並繼承了BroadReceive。代碼如下:
| 12345678910 |
public class broadCastReceiveByXml extends BroadcastReceiver{ @Override public void onReceive(Context arg0, Intent arg1) { Log.d("qlf", "broadcast receive by xml"); //因為不在主UI下,不好使用控制項,所以我們這裡列印到LOG裡面查看效果 } } |
然後在AndroidManifest中的<activity></activity>節點之後我們添加一下代碼:
| 123456 |
<receiver android:name="com.qlf.broadCast.broadCastReceiveByXml"> <intent-filter> <action android:name="com.qlf.broadCastFlag"> </action> </intent-filter></receiver> |
receiver中的android:name就是我們在程式中的那個接收廣播的類。下面的intent-filter和我們講到的功能類似,而這個action就是上面的那個flag啦。現在我們運行程式,發現同樣可以實現上面的功能。啟動並執行結果如下:
除了使用我們自己發送廣播,android也內建了許多廣播。比如我們上面提到的來了訊息的時候android會發送一個action名為“android.provider.Telephony.SMS_RECEIVED”的廣播,這個時候如果我們想要接受這個廣播只要將設定檔中的那個action設定為上面這個字串就能接收到訊息資訊了。android包括了許多其他的廣播action,有興趣的同學到網上搜搜就有了。這裡就不再舉例了。
Android之旅---廣播(BroadCast)[轉]