为什么JobScheduler立即启动?

时间:2018-12-07 09:00:19

标签: java notifications android-jobscheduler

我有一个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 ms(15分钟)之后显示。

点击按钮15分钟后如何运行作业?

2 个答案:

答案 0 :(得分:0)

摘自android开发页面:

  

指定该作业应以提供的间隔重复执行,每个周期不超过一次。您无法控制在此间隔内何时执行此作业,只能保证在此间隔内最多可以执行一次该作业。

将setPeriodic与第二个参数一起使用可实现flex,它将在周期结束后的flex周期内执行。

  

指定该作业应以提供的间隔和弹性重复进行。在该周期结束时,作业可以随时在弹性长度窗口中执行。

答案 1 :(得分:0)

从此更改您的代码->

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。