android 8.0 移除静态注册广播
Android O 前瞻 - 是時候和 Implict Broadcast 說再見了
Hevin 5 個月前 簡評:果然省電是 Android O 的第一任務。日前,Android O 預覽版已經發布,這里就來介紹下 Android O 中對 Broadcast 的改變。
Android O 對于系統廣播(Broadcast)的改變歸根結底都是為了進一步的節省功耗。Google 在 Android Marshmallo (6.0, API level 23) 中引入了 Doze and App Standby 來改進 Android 系統的電池表現。
Doze 限制所有的應用程序在特殊的時間窗口中執行耗電任務,而 App Standby 會限制最少使用 App 的網絡活動。同時 Google 開始建議開發者使用 JobScheduler 來安排所有的后臺任務。在 Android Nougat (7.0) 中,Google 移除了三項隱式廣播(Implict Broadcast)(CONNECTIVITY_ACTION, ACTION_NEW_PICTURE, ACTION_NEW_VIDEO),而在 Android O 中除了這里列出的,其余所有的隱式廣播都被移除了。
Google 認為應用程序在其 manifest 中注冊了太多沒必要的 BraodcastReceiver,導致了不必要的耗電。比如,很多的應用和第三方 SDK 都會監聽 CONNECTIVITY_ACTION 廣播。當你離開家,斷開了家里的 wifi。Android 發送 CONNECTIVITY_ACTION 廣播,結果幾乎所有的應用都會被喚醒并對此作出反應。
并且,因為 wifi 不再可用,手機會連接上移動網絡,廣播又會發送一遍,回到家再連上 wifi,相同的事再次發生。
鑒于開發者們肯定更多的只是考慮自己的應用,你可以想象一下手機里的每個應用可能都會去監聽網絡狀態變更、是否拍攝了新照片、安裝了新應用、開始充電等等事件。因為這些 App 都在 AndroidManifest.xml 中注冊接收這些廣播,所以它們總是能被喚醒接收這些廣播,即使不在前臺,甚至沒有運行。Google 也意識到隱式廣播被濫用了,因此才會在 Android O 中清除了如此多的隱式廣播。
那在 Android O 中我們應該怎么做呢?
1. 確定哪些 Broadcast 是隱式(Implict)的
根據官方文檔,所有沒有直接和你應用相關的廣播都是隱式的。比如文檔中舉例的 ACTION_PACKAGE_REPLACED,會在每個新應用安裝時被廣播。因此,像 ACTION_MY_PACKAGE_REPLACED 這樣的就是顯式廣播(explicit Broadcast),因為其只會在你的應用更新時才會進行廣播。
絕大多數我們監聽的廣播都是隱式的。2. 確定你的應用是否會被影響
這里列出的是沒有被移除的隱式廣播,也就是如果你的應用只是監聽了這些廣播的話,那么恭喜你,你的應用不需要改。
3. 如果應用確實監聽了這些被移除的隱式廣播,JobScheduler 來解救你
JobScheduler 完美適配 Doze 和 App Standby,可以根據定義的條件來執行任務,比如:
ComponentName myService = new ComponentName(this, MyService.class); JobInfo myJob = new JobInfo.Builder(myService).setRequiresCharging(true).setRequiredNetworkType(JobInfo.NETWORK_TYPE_ANY).setPersisted(true).build();JobScheduler jobScheduler = (JobScheduler) getSystemService(Context.JOB_SCHEDULER_SERVICE); jobScheduler.schedule(myJob);不過,JobSchedular 只支持 Android API 21 及以上,如果你的應用需要支持以下版本的系統,官方建議可以使用 FirebaseJobDispatcher。
這里推薦可以用 Evernote 的 Android-Job。其能夠根據當前系統,當系統為 Marshmallow 及以上時使用 JobSchedular。當版本沒達到時,根據是否集成了 Google Play Service 來使用 GCMNetworkManager 或 AlarmManager。結論
不要再監聽 Android 移除的隱式通知,使用 JobSchedular, FirebaseJobDispatcher 或 Android-Job 來實現相同的功能。總結
以上是生活随笔為你收集整理的android 8.0 移除静态注册广播的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 老司机谈APK瘦身套路-项目优化篇
- 下一篇: TCP、UDP以及HTTP的简单讲解