Android基礎之五:四大組件(Broadcast Receiver)

  • Broadcast Receiver做爲Android四大組件之一,在整個系統中普遍運用,系統中存在各類各樣的廣播機制,例以下載,網絡等都有具體的廣播接收器
  • 廣播在很大程度上簡化了開發,能夠經過廣播監聽系統狀態變化,監聽另外一App中事件傳遞,能夠接收當前App中不一樣組件,不一樣UI、不一樣線程之間的消息傳遞
  • 廣播的建立與使用
    • 建立一個繼承自BroadcastReceiver類的子類,重寫onReceiver方法
    • public class MReceiver extends BroadcastReceiver {
          @Override
          public void onReceive(Context context, Intent intent) {
              //ToDo
          }
      }
    • 注意在onReceive中不能處理耗時操做,通常不能超過6s,超過6s就會報Exception異常,若是有耗時操做,都放到輔助線程中運行,輔助線程具體參考Android基礎之多線程開發
    • Manifest中須要註冊該Receiver
      • receiver節點
        • 屬性:name:指定receiver類路徑
        • 子節點intent-filter
          • 屬性:priority:優先級,-1000~1000,優先級高的可以早接收到廣播,只有sendOrderedBroadcast發送纔有用
          • 子節點
            • action:標識,爲隱式Intent調用準備,能夠跨應用接收廣播
    • <receiver android:name=".MReceiver" android:exported="true">
           <intent-filter android:priority="100">
               <action android:name="com.example.AndroidTest_01.receiver1"></action>
           </intent-filter>
      </receiver>
    • 完成註冊後並非在應用啓動的時候廣播接收器才啓用,而是一直運行在系統中,無論應用是打開仍是退出,都會啓用,在接收到消息後都會執行onReceiver,儘管App已經退出了,所以這裏若是須要與App進行交互,須要注意
    • 跨應用接收廣播,或者接收系統廣播須要設置android:exported=true;
    • 發送廣播
      • 建立廣播Intent
        • 顯式建立Intent
        • Intent intent1=new Intent(MyActivity.this,MReceiver.class);
          sendBroadcast(intent1);
        • 隱式建立Intent
        • Intent intent1=new Intent();
          intent1.setAction("com.example.AndroidTest_01.receiver1");
          sendBroadcast(intent1);
      • 發送廣播
        • 普通發送
        • sendBroadcast(intent1);
        • 有序發送
        • sendOrderedBroadcast(intent1,null);
        • 有序廣播配合廣播註冊優先級使用,可以控制接收器接收順序,而且在優先級高的接收器中能夠中止對優先級低的接收器進行繼續廣播
        • @Override
          public void onReceive(Context context, Intent intent) {
              //ToDo
              abortBroadcast();
          }
        • 滯留廣播發送StickyBroadcast、StickyOrderedBroadcast
          • 滯留廣播具體表現爲能夠先發送消息,再註冊接收,即先上船後補票
          • 當發送滯留廣播時,系統會保留最後發送的一條滯留廣播所帶信息,當有符合要求的接收器註冊時都會自動收到帶有該信息的廣播
          • StickyBroadcast與StickyOrderedBroadcast的區別同Broadcast與OrderedBroadcast同樣
          • 既然可以保存在系統中,那麼也就可以刪除,刪除方法是removeStickyBroadcast
  • 動態註冊與靜態註冊
    • 在Manifest中註冊是靜態註冊,在應用安裝後就自動註冊到系統中,這種方式長期消耗內存,適合監聽系統廣播以及應用生命週期中一直使用的廣播
    •  Android還支持一種代碼中註冊的方式,可以靈活實現接收器註冊,適合運用在應用內部監聽的消息廣播
    • 動態註冊方式
      • 註冊
      • registerReceiver(new MReceiver(),new IntentFilter("com.example.AndroidTest_01.receiver1"));
      • 既然有動態註冊那就有對應的動態取消註銷
      • MReceiver receiver=new MReceiver();
        unregisterReceiver(receiver);
      • 動態註銷須要經過註冊時的實例來註銷,所以靜態註冊的接收器不能動態註銷,只有動態註冊時保存實例引用才能註銷
      • 註冊與註銷配合使用可以優化應用性能,減小沒必要要的資源消耗
  • 發送局部廣播與全局廣播
    • 默認的發送廣播消息是全局廣播,系統中全部符合要求的接收器都可以接收到廣播消息
    • 局部廣播
      • 經過LocalBroadcastManager來發送局部廣播
      • LocalBroadcastManager localBroadcastManager=LocalBroadcastManager.getInstance(MyActivity.this);
        localBroadcastManager.sendBroadcast(new Intent("com.example.AndroidTest_01.receiver1"));
      • 經過LocalBroadcastManager發送的廣播可以只在當前應用中傳播,不會想其餘App發送廣播,保證了數據隱私性
      • 經過LocalBroadcastManager註冊的接收器也不會接收到其餘App發過來的消息,可以防止其餘App進行攻擊
      • LocalBroadcastManager比全局系統廣播更加高效
      • 一般使用局部廣播來在應用中進行廣播事件紛發與接收,配合動態註銷廣播的運行可以最大化提升應用效率
相關文章
相關標籤/搜索