【发布时间】:2018-04-03 21:13:49
【问题描述】:
我有一个发送 http 请求的服务,它在后台运行并且在“正常模式”下运行良好。问题是当我将手机置于“省电模式”时,该服务无法正常工作。但是,Whatsapp 等应用程序仍在运行。你知道发生了什么吗?
【问题讨论】:
-
很可能,他们没有使用持续运行的服务,而是响应 GCM/FCM 推送消息。
标签: java android background-process
我有一个发送 http 请求的服务,它在后台运行并且在“正常模式”下运行良好。问题是当我将手机置于“省电模式”时,该服务无法正常工作。但是,Whatsapp 等应用程序仍在运行。你知道发生了什么吗?
【问题讨论】:
标签: java android background-process
Whatsapp 等移动应用程序必须请求许可才能使其免于打盹/电池节省和应用程序待机模式。
可以通过在设置>电池>电池优化中配置白名单来手动配置。
或者从 API 23 开始,您可以使用权限模型来请求用户将他们列入白名单(请参阅 this)。从 API 你也可以通过调用isIgnoringBatteryOptimizations()来检查你的应用当前是否在白名单中
但是,您需要满足某些criteria 才能将自己列入白名单。否则,您在 Google Play 商店中维护应用时会遇到问题。
但大多数消息应用(如 Whatsapp)是通过高优先级推送通知触发的,因此尽管没有运行后台进程,但它们更有可能处于活动状态。
【讨论】:
添加权限
<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);
}
}
【讨论】:
后台服务自 Marshmallow 以来一直在开发中,自 Oreo 以来仅用于前台使用。
打盹模式会在激活时禁止任何操作,手机每隔 X 小时会打瞌睡几毫秒,某些库会允许您在此期间进行一些操作。
如果您想在打瞌睡和省电模式期间进行一些后台操作,您可能需要查看JobScheduler 以了解在手机未打盹时每 15 分钟或更长时间执行一次的操作,如果您需要更频繁地操作,我建议您查看JobDispatcher。退出打盹模式时,两者都会执行你的任务
【讨论】:
使用 worker 将使您的应用程序能够在打盹窗口中运行,但网络调用将被禁止。 因此,您需要请求忽略电池优化,以便您可以拨打网络电话。
【讨论】: