Я отвечу на свой вопрос.
Около месяца наблюдений и попыток я наконец получил то, что хочу.
Ответ на вопрос - ДА, но НЕТ. Потоки живы в режиме ожидания, но то, что они делают внутри, приостановлено.
Моя служба переднего плана имеет FusedLocationProviderClient, который выполняется с интервалом в минуту, и потоки, выполняющие некоторые другие операции, такие как проверка связи с моим сервером с интервалом в шесть минут. Они оба не умрут, но произошла огромная задержка при пинге. Предполагается, что он проверяет связь с сервером каждые шесть минут, но, находясь в режиме ожидания, он отправляет эхо-запрос с задержкой 30 минут или более, даже после часа.
Я использовал два подхода, чтобы исправить это. Я не знаю, кто из них делает эту работу, но она все равно работает.
(1) Добавлен белый список батарей при запуске.
Intent intent = PowerSaverHelper.prepareIntentForWhiteListingOfBatteryOptimization(getContext(), getPackageName(), false);
if (intent != null) {
startActivityForResult(intent, 19810);
} else {
getInterval();
}
(2) Создание и удержание частичного wakeLock для onStartCommand службы Foreground.
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 извлекает местоположение GPS за минуту (если может) и проверяет сервер с точным интервалом в течение ночи, когда устройство не подключено ни к какому источнику питания.
Но падение этого метода вполне ожидаемо. Разряд батареи. Просматривая это через Battery Historian, я увидел, что процессор всегда активен, пока работает служба переднего плана. Даже удаляя gps (который разряжает батарею), он потратил около 0,7% батареи за час тестирования.
Однако, если ваша цель похожа на мою, специальное приложение, которое должно быть постоянным, этот подход может помочь.