思維導圖
廣播接收器
• 廣播(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()方法發送
的廣播爲系統全局廣播,發出的廣播可以被其他應用接收到,也可以接收到其
他應用的廣播。
總結
- 動態註冊不是常駐型的,生命週期伴隨着Activity的生命週期,應在Activity銷燬前註銷接收器。
- 靜態註冊時常駐型,應用關閉後,如果收到符合要求的廣播信息,程序也會被系統調用運行。
- 當廣播爲有序廣播時,優先級高的先接收到(不分靜態和動態),優先級相同時,動態優先於靜態。
- 當廣播爲標準廣播時,無視優先級,動態優先於靜態。
異常記錄
• 靜態註冊時 一直收不到廣播 查看日誌 發現報錯 Background execution not
allowed:
• 原因:Android8.0開始已經對隱式廣播做了限制。
• 解決辦法:
-
既設置action,也設置package。
-
將sdk版本降到26以下
-
使用動態註冊