Как я могу гарантировать, что служба непрерывного круглосуточного мониторинга работоспособности Wear OS продолжает работAndroid

Форум для тех, кто программирует под Android
Anonymous
Как я могу гарантировать, что служба непрерывного круглосуточного мониторинга работоспособности Wear OS продолжает работ

Сообщение Anonymous »

Я работаю над приложением Wear OS, которое круглосуточно отслеживает данные пользователей. Приложение создано для устройств Samsung в рамках исследования. Данные включают в себя некоторые данные о состоянии здоровья и данные о местоположении. Моя текущая настройка работает нормально, но у меня возникают проблемы с согласованностью. Иногда сбор данных останавливается или замедляется.
Когда приложение открывается, запускается служба мониторинга:

Код: Выделить всё

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)
}
}
}
}
Репозиторий мониторинга собирает 4–6 потоков данных датчиков и объединяет их в один класс данных, который преобразуется в JSON и отправляется на наш сервер в SEND_DATA_INTERVAL.
Репозиторий мониторинга имеет механизм резервного копирования, поэтому, если данные не отправляются из-за проблем с сетью, данные сохраняются локально, и WorkManager пытается отправить накопленные данные, когда сеть снова станет доступна.
Я не уверен, что это такое. остановка или замедление мониторинга. Я знаю, что система будет немного бороться с приложением, но мониторинг жизненно важен для наших экспериментов, поэтому целостность данных более важна, чем работоспособность устройства.
Я видел такие решения, как блокировка пробуждения и менеджеры оповещений или менеджеры работ, которые перезапускают службу, если она останавливается, но сообщения, в которых говорится о них, уже устарели, поэтому я больше не уверен, что это лучшее решение.
Мой вопрос: как я могу надежно обнаружить, предотвратить и восстановить работу службы переднего плана Android убит, и как я могу проверить или убедиться, что он продолжает работать в течение длительного времени без ручного мониторинга?

Вернуться в «Android»