Сервисы никогда не предназначались для работы вечно, и это поведение, скорее всего, вызвано режимом ожидания, и если вы работаете на уровне API 26 или выше, существуют более строгие ограничения для фоновых служб ,
Вы можете запустить службу переднего плана (которая требует постоянного уведомления, чтобы сообщить пользователю, что ваше приложение работает), но даже службы переднего плана небезопасны, чтобы их не убить, когда система решитсделайте это.
В вашем случае вы можете взглянуть на Work Manager из компонентов Jetpack.Он предлагает метод для планирования задания при изменении URI контента: addContentUriTrigger ()
Пример кода:
// first define a worker - this will get called by the WorkManager and
// performs the code you put in doWork()
class YourWorker(context : Context, params : WorkerParameters)
: Worker(context, params) {
override fun doWork(): Result {
//your code
}
}
// add your content uri as a constraint trigger
val constraints = Constraints.Builder()
.addTriggerContentUri(YOUR_CONTENT_URI)
.build()
// create a request for the WorkManager
var req : OneTimeWorkRequest = OneTimeWorkRequestBuilder<YourWorker>()
.setConstraints(constraints)
.build()
// push your request to the WorkManager
WorkManager.getInstance().enqueue(req)
Официальный Codelab от Google - хороший способчтобы лучше понять концепции: Фоновая работа с WorkManager