1. 程式人生 > >Android 7.0無法接收網路變化廣播

Android 7.0無法接收網路變化廣播

今天我們的app發現一個問題,就是小米5(android 7.0)手機無法接收到系統網路變化的廣播,而vivo(android 5.0)可以接收到,我將靜態註冊(在manifest中配置)改為動態註冊可以接收到廣播,因此我想可能有2個原因造成了此問題:

  • android 7.0對網路變化的靜態註冊遮蔽了。
  • 小米自己修改了系統。

我到官網檢視7.0的變化發現果然是7.0系統做了優化:

Project Svelte:後臺優化
Android 7.0 移除了三項隱式廣播,以幫助優化記憶體使用和電量消耗。此項變更很有必要,因為隱式廣播會在後臺頻繁啟動已註冊偵聽這些廣播的應用。刪除這些廣播可以顯著提升裝置效能和使用者體驗。

移動裝置會經歷頻繁的連線變更,例如在 WLAN 和移動資料之間切換時。目前,可以通過在應用清單中註冊一個接收器來偵聽隱式 CONNECTIVITY_ACTION 廣播,讓應用能夠監控這些變更。由於很多應用會註冊接收此廣播,因此單次網路切換即會導致所有應用被喚醒並同時處理此廣播。

同理,在之前版本的 Android 中,應用可以註冊接收來自其他應用(例如相機)的隱式 ACTION_NEW_PICTURE 和 ACTION_NEW_VIDEO 廣播。當用戶使用相機應用拍攝照片時,這些應用即會被喚醒以處理廣播。

為緩解這些問題,Android 7.0 應用了以下優化措施:

面向 Android 7.0 開發的應用不會收到 CONNECTIVITY_ACTION 廣播,即使它們已有清單條目來請求接受這些事件的通知。在前臺執行的應用如果使用 BroadcastReceiver 請求接收通知,則仍可以在主執行緒中偵聽 CONNECTIVITY_CHANGE。
應用無法傳送或接收 ACTION_NEW_PICTURE 或 ACTION_NEW_VIDEO 廣播。此項優化會影響所有應用,而不僅僅是面向 Android 7.0 的應用。
如果您的應用使用任何 intent,您仍需要儘快移除它們的依賴關係,以正確適配 Android 7.0 裝置。Android 框架提供多個解決方案來緩解對這些隱式廣播的需求。例如,JobScheduler API 提供了一個穩健可靠的機制來安排滿足指定條件(例如連入無限流量網路)時所執行的網路操作。您甚至可以使用 JobScheduler 來適應內容提供程式變化。

如需瞭解有關 Android N 中後臺優化以及如何改寫應用的詳細資訊,請參閱後臺優化。

所以我們只能修改動態註冊廣播的方式了,