Android JobScheduler запускается только один раз в день

Я проверяю API JobScheduler, который можно использовать, начиная с уровня Android API 21. Я хочу запланировать задачу, для которой требуется Интернет и которая выполняется только один раз в день или необязательно один раз в неделю (в случае успешного выполнения). Я не нашел примеров об этом условии. Кто-нибудь может мне помочь? Спасибо.


person Happo    schedule 16.08.2017    source источник
comment
Используйте setPeriodic() для времени и setRequiredNetworkType() для требования Интернета.   -  person CommonsWare    schedule 17.08.2017


Ответы (1)


Следуйте простому примеру для вашего вопроса, я считаю, что это поможет вам:

AndroidManifest.xml:

<service android:name=".YourJobService"
    android:permission="android.permission.BIND_JOB_SERVICE" />

YourJobService.java:

class YourJobService extends JobService {
    private static final int JOB_ID = 1;
    private static final long ONE_DAY_INTERVAL = 24 * 60 * 60 * 1000L; // 1 Day
    private static final long ONE_WEEK_INTERVAL = 7 * 24 * 60 * 60 * 1000L; // 1 Week

    public static void schedule(Context context, long intervalMillis) {
        JobScheduler jobScheduler = (JobScheduler) 
            context.getSystemService(Context.JOB_SCHEDULER_SERVICE);
        ComponentName componentName =
            new ComponentName(context, YourJobService.class);
        JobInfo.Builder builder = new JobInfo.Builder(JOB_ID, componentName);
        builder.setRequiredNetworkType(JobInfo.NETWORK_TYPE_ANY);
        builder.setPeriodic(intervalMillis);
        jobScheduler.schedule(builder.build());
    }

    public static void cancel(Context context) {
        JobScheduler jobScheduler = (JobScheduler)
            context.getSystemService(Context.JOB_SCHEDULER_SERVICE);
        jobScheduler.cancel(JOB_ID);    
    }

    @Override
    public boolean onStartJob(final JobParameters params) {
        /* executing a task synchronously */
        if (/* condition for finishing it */) {
            // To finish a periodic JobService, 
            // you must cancel it, so it will not be scheduled more.
            YourJobService.cancel(this);
        }

        // false when it is synchronous.
        return false;
    }

    @Override
    public boolean onStopJob(JobParameters params) {
        return false;
    }
}

После планирования задания по телефону YourJobService.schedule(context, ONE_DAY_INTERVAL). Он будет вызываться только при подключении к какой-либо сети и один раз внутри внутренней один день... т.е. один раз в день при подключении к сети.

Примечания. Периодическое задание может быть завершено только вызовом JobScheduler.cancel(Job_Id), метод jobFinished() не завершит его.

Примечания: Если вы хотите изменить его на "раз в неделю" - YourJobService.schedule(context, ONE_WEEK_INTERVAL).

Примечания. Периодическое задание на Android L можно запускать один раз в любое время в заданном вами диапазоне.

person Victor Rattis    schedule 18.08.2017