JobScheduler API:如何在应用程序启动时执行一次作业,然后在此之后定期执行相同的作业?

时间:2018-04-13 20:32:08

标签: android android-jobscheduler

我已经在互联网上搜索了几个小时,试图找到解决我遇到的问题的方法,但无济于事。

我的问题如下:

根据我的理解,如果您想使用JobScheduler API在Android上创建定期作业,您需要在setPeriodic()中设置JobInfo.Builder方法,但是,我已经读过从Android Nougat开始的最小值时间间隔是15分钟。

我正在尝试在应用程序打开后立即执行作业,然后定期执行某些时间间隔。到目前为止这是我的代码

   public class ScheduledJobService extends JobService {
    @Override
    public boolean onStartJob(JobParameters jobParameters) {

    //do something
        return true;
    }

    @Override
    public boolean onStopJob(JobParameters jobParameters) {

        return true;
    }

在我的MainActivity

@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        ComponentName serviceName = new ComponentName(this, ScheduledJobService.class);

        JobInfo jobInfo = new JobInfo.Builder(JOB_ID,serviceName)
                .setRequiredNetworkType(JobInfo.NETWORK_TYPE_ANY)
                .setRequiresDeviceIdle(false)
                .setRequiresCharging(false)
                .setPeriodic(10000);
                .setPersisted(true)
                .build();

        scheduler = (JobScheduler) getSystemService(Context.JOB_SCHEDULER_SERVICE);

        int result = scheduler.schedule(jobInfo);

        if (result == JobScheduler.RESULT_SUCCESS) {
            Log.d("JobSchedule", "job created");
        } else {
            Log.d("JobSchedule", "job not created");
        }

    }

如果我删除setPeriodic(),就会像我想要的那样立即执行作业,但显然它不会再次执行,如果我使用setPeriodic(),我必须等待一段时间才能执行第一次执行。

我想知道是否有办法让我在启动后立即执行该工作然后继续定期运行?

感谢。

1 个答案:

答案 0 :(得分:0)

我使用Alarm Manager实现了同样的功能。您可以使用以下代码:

在活动的OnCreate中

public void schedule() {

        Utils.log("Scheduling Service");
        Intent myIntent = new Intent(getContext(), MyService.class);
        PendingIntent pendingIntent = PendingIntent.getService(
                getContext(),  100, myIntent,0);

        AlarmManager alarmManager = (AlarmManager)getContext().getSystemService(Context.ALARM_SERVICE);
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
            alarmManager.setExactAndAllowWhileIdle(AlarmManager.RTC_WAKEUP, System.currentTimeMillis(), pendingIntent);
        }
        else{
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
                alarmManager.setExact(AlarmManager.RTC_WAKEUP, System.currentTimeMillis(), pendingIntent);
            }
        }

    }

这将启动您的服务,您将在其中编写业务逻辑:

        public class MyService extends IntentService{

    @RequiresApi(api = Build.VERSION_CODES.KITKAT)
    @Override
    protected void onHandleIntent(@Nullable Intent intent) {
    // Do your business logic here and after that schedule your job again
    scheduleRepeatingJob();

    }

private void scheduleRepeatingJob(){
        Intent myIntent = new Intent(this, MyService.class);

        PendingIntent pendingIntent = PendingIntent.getService(this, 100, myIntent, 0);
        AlarmManager alarmManager = (AlarmManager) this.getSystemService(Context.ALARM_SERVICE);
        long triggerTime = Utils.getTimestampForNextAlarm(); // TIme when you want to repeat your job
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
            //alarmManager.setExactAndAllowWhileIdle(AlarmManager.RTC_WAKEUP, triggerTime, pendingIntent);

            AlarmManager.AlarmClockInfo alarmClockInfo = new AlarmManager.AlarmClockInfo(triggerTime, pendingIntent);
            alarmManager.setAlarmClock(alarmClockInfo, pendingIntent);
        }
        else{
            alarmManager.setExact(AlarmManager.RTC_WAKEUP, triggerTime, pendingIntent);
        }
    }
}

这是打瞌睡模式和一切。