1. 程式人生 > >Android:四大元件之-----廣播(Broadcast)

Android:四大元件之-----廣播(Broadcast)

相信很多讀者都與筆者一樣,在剛學安卓的時候就接觸到廣播。但是並不知道廣播其實也分好幾種,我們剛學習使用的只是廣播的其中一種:普通廣播

android的廣播分為:

普通廣播,

有序廣播,

本地廣播,

sticky廣播,

下面就為大家介紹一下這四種廣播的區別與用法。

一.普通廣播

普通廣播是非同步的,通過context,sendBroadcast()傳送。傳遞效率比較高。但是所有receivers(接收器)的接收順序並不能確定。
這種廣播不能將處理結果傳遞給下一個接受者,並且無法終於廣播Intent的傳播,知道沒有與之相匹配的廣播接收器才會結束。
定義廣播接收器的方法如下:

廣播接收器與四大元件的其它元件一樣,也需要註冊,在AndroidManifest.xml註冊方式:

public class TestBroadcastRecever extends BrocadcastReceiver{
  public void onReceive(Context context,Intent intent){
Log.i("test","hi ");
  }
}


        <receiver android:name="xxx.TestBrocastRecever"></receiver>
使用java程式碼的註冊方式:
 IntentFilter intentFilter=new IntentFilter();
        registerReceiver(new TestBrocastRecever(),intentFilter);
用程式碼註冊的時候可以用intentFilter指定各種action。而在AndroidManifest.xml註冊的話可以通過intent-filter標籤中設定action標籤達到相同的目的。

二.有序廣播

有序廣播是通過context.sendOrderedBroadcast()傳送的。所有廣播按照接收器的優先順序高低接收。 而接收器的優先順序是通過receiver的intent-fillter的android:priority屬性設定的。數值越大優先順序越高。 當接收器收到廣播之後可以使用setResult()來將結果傳給下一個光比接收器,然後下一個廣播接收器可以通過getResult接收上一個廣播接收器返回的結果。並可以用abortBroadcast()函式來讓系統丟棄該廣播,使得該廣播不再傳遞到其它廣播接收器。

三.本地廣播

在api level21中的support v4中添加了本地廣播:LocalBrocastManager。 上面說的普通廣播和有序廣播都是全域性的,系統內所有應用都可以接收到的。這樣有可能會帶來安全隱患。在某些時候我們並不需要把自己應用內的資訊廣播給別的應用,而是程序內使用的話就可以使用本地廣播了。 本地廣播用法很簡單。只需要在傳送廣播註冊廣播和登出廣播的時候換成以下方法: LocalBroadcastManager.getInstance(context).sendBrocast();//傳送非同步廣播 LocalBroadcastManager.getInstance(context).sendBrocastSync();//傳送同步廣播
LocalBroadcastManager.getInstance(context).registerReceiver();//註冊廣播
LocalBroadcastManager.getInstance(context).unregisterReceiver();//登出廣播
本地光比與普通廣播的操作方式只是操作的類不一樣而已。其它使用法方式基本上一致。因此替換為本地廣播的成本會比較低。在不需要其它程序接收廣播的情況下使用本地廣播是有必要的。

四.sticky廣播

 sticky廣播通過context.sendStickyBrocast(0函式傳送,用該該函式傳送的廣播會一直滯留,當有匹配的廣播接收器被註冊後,該廣播接收器就會接收到該廣播。 該廣播比較特殊,需要BROADCAST_STICK許可權才能使用。 sticky廣播只保留最後一挑廣播,並且會一致保留下去,這樣即使已經有廣播接收器處理了該廣播,當再有匹配該廣播的廣播接收器註冊的時候,就會接收到該廣播。如果想移除該廣播可以使用removeStickyBrocast(0函式移除。