web-dev-qa-db-ja.com

Android JobSchedulerは1日1回のみ実行されます

Android APIレベル21以降に使用できるJobSchedulerAPIをチェックアウトします。インターネットを必要とし、1日1回のみ、またはオプションで1週間に1回実行されるタスクをスケジュールしたい(正常に実行された場合) )この状態の例は見つかりませんでした。誰かが私を助けてくれますか?ありがとう。

9
Happo

あなたの質問の簡単な例に従ってください、私はそれがあなたを助けると信じています:

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)を呼び出します。これは、あるネットワークに接続しているときにのみ呼び出され、内部で1日1回、つまりネットワークに接続して1日1回呼び出されます。

Obs.:定期的なジョブは、JobScheduler.cancel(Job_Id)の呼び出しでのみ終了でき、jobFinished()メソッドは終了しません。

Obs.:「週に1回」に変更したい場合--YourJobService.schedule(context, ONE_WEEK_INTERVAL)

obs.:Android Lの定期的なジョブは、設定した範囲内でいつでも1回実行できます。

15
Victor Rattis