Служба прерывается, когда телефон засыпает
В моем приложении я запускаю сервис, содержащий fileobserver для мониторинга каталога. Моя проблема в том, что через некоторое время служба прерывается, и, если вы просыпаетесь, служба запускается снова. Я также пытался подключить файл наблюдателя к статической переменной внутри службы, но он все еще не работает. Кто может привести пример работы fileobserver внутри службы, запущенной при загрузке телефона, и не прерываемой при засыпании телефона?
1 ответ
Службы никогда не предназначались для вечной работы, и это поведение, скорее всего, вызвано режимом бездействия, и если вы работаете на уровне 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