运行 节电模式下的后台服务 Android

Run background services on battery saver mode Android

我有一个发送 http 请求的服务,该服务在后台运行并且在 "normal mode" 上运行良好。问题是当我将 phone 置于 "battery saver mode" 时,服务无法正常工作。但是,像 Whatsapp 这样的应用程序仍然可以使用。你知道发生了什么事吗?

像 Whatsapp 这样的移动应用程序必须请求权限才能免除它们 Doze/battery 保存和应用程序待机模式。

可以通过在设置>电池>电池优化中配置白名单来手动配置。

或者从API 23,你可以使用权限模型来请求用户将他们列入白名单(参考this). From API You can also check whether your app is currently on White list by calling isIgnoringBatteryOptimizations()

但是您需要满足某些 criteria 才能将自己列入白名单。否则,您在 Google Play Store 上维护应用程序时会遇到问题。

但大多数像 Whatsapp 这样的消息应用程序都是通过 high-priority 推送通知触发的,因此即使没有 运行 后台进程,它们也更有可能处于活动状态。

自 Marshmallow 以来,后台服务一直在开发中,自 Oreo 以来,除前台使用外,不再用于任何其他用途。

打瞌睡模式将在激活时禁止任何操作,phone 每隔 X 小时就会停止打瞌睡几毫秒,某些库将允许您在此期间进行一些操作。

如果您想在休眠和节电模式期间执行一些后台操作,您可能需要查看 JobScheduler for operation that will be executed every 15 minutes or more while the phone is not in doze and if you require operations more often, i would advice you to have a look at the JobDispatcher。两者都将在退出打瞌睡模式时执行您的任务

添加权限

<uses-permission 
android:name="android.permission.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS"/>

请求将您的应用列入白名单

 if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
            Intent intent = new Intent();
            String packageName = getPackageName();
            PowerManager pm = (PowerManager) getSystemService(POWER_SERVICE);
            if (!pm.isIgnoringBatteryOptimizations(packageName)) {
                intent.setAction(Settings.ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS);
                intent.setData(Uri.parse("package:" + packageName));
                startActivity(intent);
            }
        }

使用 worker 将使您的应用程序能够 运行 打瞌睡 windows 但网络调用将被禁止。 因此您需要请求忽略电池优化,以便您可以进行网络调用。