Android 9 всегда вызывает onStopJob сразу после того, как onStartJob возвращается с true - PullRequest
0 голосов
/ 28 октября 2018

У меня запланированное задание реализовано следующим образом:

class RefreshImageService : JobService() {
    override fun onStartJob(params: JobParameters): Boolean {
        info { "RefreshImage: start job" }
        appCoroScope.launch {
            fetchImageAndUpdateWidget()
            info { "RefreshImage: finished" }
            jobFinished(params, false)
        }
        return true
    }

    override fun onStopJob(params: JobParameters): Boolean {
        info { "RefreshImage: stop job" }
        return true
    }
}

В журналах я всегда вижу RefreshImage: stop job сразу после RefreshImage: start job, а затем, позже, RefreshImage: finished, что означает, что Android выпустил мойсразу же, и мое служение было позволено закончить только случайно.Вероятно, он был бы уничтожен, если бы запрос HTTP занял немного больше времени.

Вот как я объявляю службу:

<service
    android:name=".RefreshImageService"
    android:permission="android.permission.BIND_JOB_SERVICE"
/>

И вот как я планирую:

val jobInfo = JobInfo.Builder(refreshImageJobId, 
        ComponentName(context, RefreshImageService::class.java))
    .setRequiredNetworkType(JobInfo.NETWORK_TYPE_ANY)
    .setMinimumLatency(latencyMillis)
    .setOverrideDeadline(HOUR_IN_MILLIS)
    .build()
context.jobScheduler.schedule(jobInfo)

Есть ли что-то, что я делаю неправильно, или, возможно, есть обходной путь, который заставил бы Android вести себя правильно?

1 Ответ

0 голосов
/ 28 октября 2018

Я понял, что проблема заключается в fetchImageAndUpdateWidget(), который также должен учитывать планирование следующей выборки изображений на основе заголовка Last-Modified текущего HTTP-результата.Если Android решит убить мою работу до того, как она достигнет кода планирования, моя работа больше никогда не запустится.

Чтобы предотвратить это, я добавил строку, которая предварительно планирует расписание перед выполнением HTTP-запроса.Это, однако, заставило Android попытаться немедленно остановить мое текущее задание, согласно документации JobScheduler.schedule():

Если задание с данным ID в настоящее время выполняется, оно будет остановлено.

Это оставляет меня без возможности надежно реализовать мое планирование.Мне пришлось прибегнуть к другой запланированной работе, чтобы проверить, не утратила ли моя основная работа свой график.

...