Служба прерывается, когда телефон засыпает - PullRequest
0 голосов
/ 08 февраля 2019

В моем приложении я запускаю сервис, содержащий fileobserver для мониторинга каталога.Моя проблема в том, что через некоторое время служба прерывается, и, если вы просыпаетесь, служба запускается снова.Я также пытался подключить файл наблюдателя к статической переменной внутри службы, но он все еще не работает.Кто может привести пример работы fileobserver внутри службы, запущенной при загрузке телефона, и не прерываемой при засыпании телефона?

1 Ответ

0 голосов
/ 08 февраля 2019

Сервисы никогда не предназначались для работы вечно, и это поведение, скорее всего, вызвано режимом ожидания, и если вы работаете на уровне 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

...