У меня странное поведение с моим экземпляром 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