Android中的四大組件之-Boradcast

Android引入廣播機制的用意

  1. 從MVC的角度考慮
  2. 程序間互通消息(例如在自己的程序內中監聽系統電話)
  3. 效率上(參考UDP的廣播協議在局域網的方便性)
  4. 設計模式上(反轉控件的一種應用,類你監聽者模式)

廣播發送的兩種類型

普通廣播:完全異步的,所有的廣播接收者在同一時刻以未定義的順序運行,消息傳遞的效率比較高。但缺點是:接收者不能將處理結果傳遞給下一個接收者,並且無法終止廣播Intent的傳播
順序廣播:所有廣播接收者按順序執行,其中一個執行廣播接收者可以將結果傳遞給下一個廣播接收者,也可以退出廣播以便於不將結果傳遞到下一個廣播接收者,可以在清單文件使用android:priority屬性來確定廣播接收者的優先級,數越大優先級別越高,取值範圍:-1000到1000。也可以調用IntentFilter對象的setPriority()進行設置),被接收者依次接收廣播,同一優先級的接收者可以隨機順序執行。
Context.sendBroadcast():發送的是普通廣播,所有訂閱者都有機會獲得並進行處理。
Context.sendOrderedBroadcast():發送的是有序廣播,系統會根據接收者聲明的優先級別按順序逐個執行接收者,前面的接收者有權終止廣播(通過BroadcastReceiver.abortBroadcast()),如果廣播被前面的接收者終止,後面的接收者就再也無法獲取到廣播。對於有序廣播,前面的接收者可以將處理結果存放進廣播Intent,然後傳給下一個接收者。

廣播發送

使用ContextWrapper類中的public void sendBroadcast(Intent intent)發送廣播,例如:

 Intent intent=new Intent();
 intent.setAction("com.example.boradcastreceive.MainActivity");
 intent.putExtra("message", "你好");
 sendBroadcast(intent);

廣播註冊的兩種方式

動態註冊:非長駐性廣播,生命週期可控制
Activity的子類中使用registerReceiver()方法註冊,如下:

MyBoradcastReceive receiver=new MyBoradcastReceive();
IntentFilter filter=new IntentFilter("com.example.boradcastreceive.MainActivity");
registerReceiver(receiver, filter);

靜態註冊:長駐性廣播,一旦應用程序被安裝就能接收到廣播,生命週期不可控制
在清單文件中標記中進行註冊,例如:

<receiver android:name="com.example.orderboradcastrecevie1.MyBordcast">
        <intent-filter android:priority="1000">
             <action android:name="com.example.orderboradcastrecevie1.MainActivity"/>
         </intent-filter>
 </receiver>

廣播接收器(BroadcastReceiver)

通過繼承BroadcastReceiver抽象類實現廣播接收器,在廣播接收器中可以通過 abortBroadcast()終止廣播,用setResultExtras()來發送數據。

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