Когда приложение открывается, запускается служба мониторинга:
Код: Выделить всё
class MainActivity: ComponentActivity() {
override fun onStart() {
checkForegroundPermissions()
// When permissions are given launchForegroundService is run
}
private fun launchForegroundService() {
val serviceIntent = Intent(this, ForegroundMonitoringService::class.java)
startForegroundService(serviceIntent)
bindService(serviceIntent, foregroundOnlyServiceConnection, BIND_AUTO_CREATE)
}
}
Внутри сервиса я запускаю его как сервис переднего плана:
Код: Выделить всё
class ForegroundMonitoringService : Service() {
private val serviceJob = SupervisorJob()
private val serviceScope = CoroutineScope(serviceJob + Dispatchers.Default)
override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int {
super.onStartCommand(intent, flags, startId)
startForeground()
startMonitoringJob()
return START_STICKY
}
private fun startForeground() {
val serviceTypes = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.UPSIDE_DOWN_CAKE) {
FOREGROUND_SERVICE_TYPE_LOCATION or FOREGROUND_SERVICE_TYPE_HEALTH
} else {
0
}
ServiceCompat.startForeground(
this,
SERVICE_ID,
generateNotification(isMonitoring = false),
serviceTypes
)
}
private fun startMonitoringJob() {
while (isActive) {
monitoringJob?.cancel()
monitoringJob = serviceScope.launch {
val result = monitoringRepository.sendData()
result
.onSuccess {}
.onFailure { error -> ...}
delay(SEND_DATA_INTERVAL)
}
}
}
}
Репозиторий мониторинга имеет механизм резервного копирования, поэтому, если данные не отправляются из-за проблем с сетью, данные сохраняются локально, и WorkManager пытается отправить накопленные данные, когда сеть снова станет доступна.
Я не уверен, что это такое. остановка или замедление мониторинга. Я знаю, что система будет немного бороться с приложением, но мониторинг жизненно важен для наших экспериментов, поэтому целостность данных более важна, чем работоспособность устройства.
Я видел такие решения, как блокировка пробуждения и менеджеры оповещений или менеджеры работ, которые перезапускают службу, если она останавливается, но сообщения, в которых говорится о них, уже устарели, поэтому я больше не уверен, что это лучшее решение.
Мой вопрос: как я могу надежно обнаружить, предотвратить и восстановить работу службы переднего плана Android убит, и как я могу проверить или убедиться, что он продолжает работать в течение длительного времени без ручного мониторинга?