我将回答自己的问题。
经过大约一个月的观察和尝试,我最终得到了我想要的。
关于问题的答案是肯定的,但也是否定的。线程在待机模式下仍然活跃,但它们内部执行的操作被挂起。
我的前台服务有一个FusedLocationProviderClient,它以一分钟为间隔运行,还有一个线程,每六分钟进行ping服务器等其他操作。它们都不会停止,但是ping服务器的延迟非常大。本来应该每六分钟ping一次服务器,但是在待机模式下,延迟长达30分钟或更久,甚至超过一小时。
我采用了两种方法来解决这个问题。我不知道哪一种方法使这个问题得到了解决,但无论如何,它都可以工作。
(1) 启动时添加电池白名单。
Intent intent = PowerSaverHelper.prepareIntentForWhiteListingOfBatteryOptimization(getContext(), getPackageName(), false);
if (intent != null) {
startActivityForResult(intent, 19810);
} else {
getInterval();
}
(2) 在前台服务的 onStartCommand 中创建并持有一个部分 wakeLock。
try {
PowerManager powerManager = (PowerManager) getSystemService(POWER_SERVICE);
wakeLock = powerManager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK,
"MyService::GpsWakeLock");
if (!wakeLock.isHeld()) {
wakeLock.acquire();
}
} catch (Exception e) {
ErrorController.showError(e);
}
并在前台服务的onDestroy中释放它。
if (wakeLock != null && wakeLock.isHeld()) {
wakeLock.release();
}
这个解决方案对我很有效。GPS每分钟获取一次位置(如果可以),并在准确的时间间隔内向服务器发送ping,即使设备没有连接到任何电源也能在过夜期间工作。
但是,这种方法的缺点是可预见的。电池会耗尽。通过Battery Historian查看时,我发现前台服务正在运行时CPU始终处于唤醒状态。即使删除了GPS功能(它会消耗大量电池),在一个小时的测试中仍然消耗了约0.7%的电池。
但是,如果您的目标与我的相似,即特殊用途应用程序应该是持久的,那么这种方法可能有所帮助。