美文网首页AndroidAndroid知识Android开发
Android O 前瞻 - 是时候和 Implict Broa

Android O 前瞻 - 是时候和 Implict Broa

作者: 极小光 | 来源:发表于2017-03-29 14:48 被阅读198次

    简评:果然省电是 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 来实现相同的功能。

    原文:It’s time to kiss goodbye to your implicit BroadcastReceivers

    日报延伸阅读

    欢迎关注

    • 知乎专栏「极光日报」,每天为 Makers 导读三篇优质英文文章。
    • 网易云电台「极光日报**」,上下班路上为你读报。

    相关文章

      网友评论

      • 愚人自愚:换成JobScheduler后没看出哪里省电了啊,该监听还是在监听

      本文标题:Android O 前瞻 - 是时候和 Implict Broa

      本文链接:https://www.haomeiwen.com/subject/awqsottx.html