JobScheduler перестает работать иногда на простое приложения - PullRequest
0 голосов
/ 24 сентября 2019

У меня странное поведение с моим экземпляром JobService.Я пытаюсь обнаружить новые медиа на устройстве с помощью реализации.В большинстве случаев, когда появляются новые носители, обратный вызов onStartJob запускается как обычно.Но иногда (не всегда) после долгого сна устройства этот обратный вызов никогда не срабатывает при получении нового носителя (например, на снимке с камеры).И до тех пор, пока приложение не будет закрыто, обратный вызов отсутствует, но когда я открываю приложение (после появления нового носителя), обратный вызов срабатывает немедленно.Приложение не запускает некоторую логику JobScheduling при запуске (при возобновлении и т. Д.), Но сам факт открытия приложения спровоцировал немедленную реализацию моей реализации JobService.

Не думаю, что это проблема "дремоты".Вот экземпляр JobInfo, запланированный через службу JobScheduler:

static {
    JobInfo.Builder builder = new JobInfo.Builder(JOB_ID,
            new ComponentName(BuildConfig.APPLICATION_ID, MediaWatcherJob.class.getName()));
    builder.addTriggerContentUri(new JobInfo.TriggerContentUri(
            MediaStore.Images.Media.EXTERNAL_CONTENT_URI,
            JobInfo.TriggerContentUri.FLAG_NOTIFY_FOR_DESCENDANTS));
    builder.addTriggerContentUri(new JobInfo.TriggerContentUri(
            MediaStore.Images.Media.INTERNAL_CONTENT_URI,
            JobInfo.TriggerContentUri.FLAG_NOTIFY_FOR_DESCENDANTS));
    builder.addTriggerContentUri(new JobInfo.TriggerContentUri(
            Uri.parse("content://" + MediaStore.AUTHORITY + "/"),
            0));
    builder.setTriggerContentUpdateDelay(TimeUnit.SECONDS.toMillis(1));
    builder.setTriggerContentMaxDelay(TimeUnit.SECONDS.toMillis(100));
    builder.setMinimumLatency(TimeUnit.SECONDS.toMillis(1));
    builder.setRequiresDeviceIdle(false);
    builder.setRequiresCharging(false);
    JOB_INFO = builder.build();
}

Вот переопределенные методы JobService:

@Override
public boolean onStartJob(final JobParameters params)
{
    mRunningParams = params;
    // some work in separate thread with rescheduling job
    return true;
}

...

@Override
public boolean onStopJob(JobParameters params)
{
    // reschedule
    JobScheduler js = context.getSystemService(JobScheduler.class);
    int result = js.schedule(JOB_INFO);
    return false;
}

Устройство:
Samsung Galaxy S8
Android 9

1 Ответ

1 голос
/ 24 сентября 2019

Если честно, из того, что мы можем наблюдать здесь, нет хорошего ответа.Факторов может быть так много, что на данный момент это всего лишь догадки.

Проверьте это: https://dontkillmyapp.com/

Фоновые процессы уничтожения OEM, Samsung - один из худших.

Я лично перенес все свои Задания / Фоновые службы во всех своих приложениях в WorkManager, с которыми я добился лучших результатов.WorkManager "гарантированно завершен".

Проверьте мой пост здесь:

Как ежечасно срабатывать будильник при закрытии приложения

...