Почему JobScheduler запускается сразу? - PullRequest
0 голосов
/ 07 декабря 2018

У меня есть код для JobScheduler, который запускается после нажатия кнопки:

 ComponentName serviceName = new ComponentName(v.getContext(), TestJobService.class);
 JobInfo jobInfo = new JobInfo.Builder(1, serviceName)
         .setRequiresDeviceIdle(false)
         .setRequiresCharging(false)
         .setPeriodic(900000)
         .setBackoffCriteria(10000, JobInfo.BACKOFF_POLICY_LINEAR)
         .setPersisted(true)
         .setRequiresDeviceIdle(false)
         .build();

 JobScheduler scheduler = (JobScheduler) v.getContext().getSystemService(Context.JOB_SCHEDULER_SERVICE);
 scheduler.schedule(jobInfo);

И у меня есть задача в TestJobService extends JobService для показа Notification:

public boolean onStartJob(JobParameters params) {

    Intent test = new Intent(this, Diarys.class);
    NotificationManager mNotificationManager =
            (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);


    String NOTIFICATION_CHANNEL_ID = "Nilesh_channel";
    NotificationCompat.Builder notificationBuilder = new NotificationCompat.Builder(this, NOTIFICATION_CHANNEL_ID);
    notificationBuilder.setAutoCancel(true)
            .setContentTitle(getString(R.string.app_name))
            .setContentText("test text")
            .setDefaults(Notification.DEFAULT_ALL)
            .setWhen(System.currentTimeMillis())
            .setSmallIcon(R.drawable.logonotification)
            .setAutoCancel(true);

    TaskStackBuilder stackBuilder = TaskStackBuilder.create(this);
    stackBuilder.addNextIntent(test);
    PendingIntent resultPendingIntent = stackBuilder.getPendingIntent(
            0,
            PendingIntent.FLAG_UPDATE_CURRENT
    );
    notificationBuilder.setContentIntent(resultPendingIntent);

    mNotificationManager.notify(1000, notificationBuilder.build());
    return false;
}

И когда я нажимаю кнопку для запуска JobScheduler -кода, Notification отображается сразу, а не через 900000 мс (15 минут).

Как я могу запустить задание через 15 минут после нажатия кнопки?

Ответы [ 2 ]

0 голосов
/ 07 декабря 2018

Измените свой код с этого ->

ComponentName serviceName = new ComponentName(v.getContext(), TestJobService.class);
                    JobInfo jobInfo = new JobInfo.Builder(1, serviceName)
                            .setRequiresDeviceIdle(false)
                            .setRequiresCharging(false)
                            .setPeriodic(900000)
                            .setBackoffCriteria(10000, JobInfo.BACKOFF_POLICY_LINEAR)
                            .setPersisted(true)
                            .setRequiresDeviceIdle(false)
                            .build();

на этот ->

ComponentName serviceName = new ComponentName(v.getContext(), TestJobService.class);
                    JobInfo jobInfo = new JobInfo.Builder(1, serviceName)
                            .setRequiresDeviceIdle(false)
                            .setRequiresCharging(false)
                            .setPeriodic(900000,900000)
                            .setBackoffCriteria(10000, JobInfo.BACKOFF_POLICY_LINEAR)
                            .setPersisted(true)
                            .setRequiresDeviceIdle(false)
                            .build();

из-за периода сгибания, который начнет выполнение через некоторое время.в нашем случае 15 мин. -> 15 * 60 * 1000.

0 голосов
/ 07 декабря 2018

Взято со страниц разработки Android:

Укажите, что это задание должно повторяться с указанным интервалом, не чаще одного раза за период.Вы не можете контролировать, когда в этом интервале будет выполняться это задание, только гарантия того, что оно будет выполнено не более одного раза в течение этого интервала.

Использование setPeriodic со вторым аргументом допускает flex, которыйбудет выполняться в течение периода гибкого изменения с конца периода.

Укажите, что это задание должно повторяться с указанным интервалом, и согните.Задание может выполняться в любое время в окне гибкой длины в конце периода.

...