Android 學習筆記(十一):廣播和廣播接收器的學習

思維導圖

在這裏插入圖片描述

廣播接收器

• 廣播(Broadcast)是在組件之間傳播數據的一種機制,這些組件可以位於不

同的進程中,起到進程間通信的作用。

• 廣播接收器(BroadcastReceiver) 是對發送出來的 Broadcast 進行過濾、接

受和響應的組件。

標準廣播

• 完全的異步執行的廣播,發出廣播後所有的廣播接收器幾乎會在同一時間接收

到這條廣播,沒有先後順序。效率比較高,且無法截斷。

• 通過sendBroadcast(Intent intent)方法發送。

有序廣播

• 同步執行的廣播,廣播發出後只有一個廣播接收器能夠接收到這個廣播,優先

級高的先接收到這個廣播,只有當這個廣播接收器執行完onReceive()方法

後,下一個廣播接收器才能收到這個廣播,並且上一個廣播接收器可以截斷這

個廣播。

• 通過sendOrderedBroadcast(Intent intent,String s)方法發送。

• 通過receiver註冊時的priority屬性設置優先級,越大優先級越高。

• 可以通過abortBroadcast()方法截斷廣播,這樣低優先級的就接收不到了。

靜態註冊

• 靜態註冊是通過在AndroidManifest.xml配置文件中配置receiver屬性註冊,

並配置<intent-filter>標籤設置過濾器。

• 這種方式的話接收器的生命週期伴隨着整個應用,如果這種方式處理的是系統

廣播,則即使應用沒有打開,該廣播接收器都會收到該廣播。

動態註冊

• 動態註冊時通過在代碼中設置一個IntentFIlter,然後添加一個Action,通過

context.registerReceiver(receiver,intentFilter)註冊廣播接收器。

• 通過使用context.registerReceiver(receiver)取消註冊。

• 生命週期隨着Activity的變化而變化。

本地廣播

• 本地廣播只有應用內部可以接收到,並且這個廣播接收器只能接受應用內的廣

播。本地廣播通過LocalBroadcastManager來管理。

• 註冊接收器的方法:

LocalBroadcastManager.getInstance(this).registerReceiver(BroadcastReceiver, IntentFilter)

• 註銷接收器的方法:

LocalBroadcastManager.getInstance(this).unregisterReceiver(BroadcastR

eceiver);

• 發送異步廣播:

LocalBroadcastManager.getInstance(this).sendBroadcast(Intent)

• 發送同步廣播:

LocalBroadcastManager.getInstance(this).sendBroadcastSync(Intent)

全局廣播

• 通過context.sendBroadcast()和context.sendOrderedBroadcast()方法發送

的廣播爲系統全局廣播,發出的廣播可以被其他應用接收到,也可以接收到其

他應用的廣播。

總結

  1. 動態註冊不是常駐型的,生命週期伴隨着Activity的生命週期,應在Activity銷燬前註銷接收器。
  2. 靜態註冊時常駐型,應用關閉後,如果收到符合要求的廣播信息,程序也會被系統調用運行。
  3. 當廣播爲有序廣播時,優先級高的先接收到(不分靜態和動態),優先級相同時,動態優先於靜態。
  4. 當廣播爲標準廣播時,無視優先級,動態優先於靜態。

異常記錄

• 靜態註冊時 一直收不到廣播 查看日誌 發現報錯 Background execution not

allowed:

• 原因:Android8.0開始已經對隱式廣播做了限制。

• 解決辦法:

  1. 既設置action,也設置package。

  2. 將sdk版本降到26以下

  3. 使用動態註冊

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