【问题标题】:Why JobScheduler starting immediately?为什么 JobScheduler 立即启动?
【发布时间】:2018-12-07 09:00:19
【问题描述】:

我有一个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-code 的按钮时,Notification 会立即显示,而不是在 900000 毫秒(15 分钟)之后。

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

【问题讨论】:

  • 900000 很难阅读,即使你数了数,也不明显它等于 15 分钟。我建议TimeUnit.MINUTES.toMillis(15)

标签: java notifications android-jobscheduler


【解决方案1】:

取自android开发页面:

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

将 setPeriodic 与第二个参数一起使用允许弹性,它将在弹性周期结束后的弹性周期内执行。

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

【讨论】:

    【解决方案2】:

    从此更改您的代码->

    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。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-01-03
      • 1970-01-01
      • 2017-10-09
      • 2014-08-04
      • 1970-01-01
      • 2019-03-07
      • 2021-12-17
      • 2016-04-09
      相关资源
      最近更新 更多