2017-10-01 18 views
0

実装したいのは、毎時サーバーからデータをフェッチするバックグラウンドサービスです。私はこのサービスが起動後に定期的に実行されることを期待しています。このため、私はJobSchedulerを使用してこの機能を実装することにしました。JobScheduler.schedule()を呼び出すタイミング

val jobScheduler = getSystemService(Context.JOB_SCHEDULER_SERVICE) as JobScheduler val builder = JobInfo.Builder(1, ComponentName(this, PullDataJob::class.java)) .setPeriodic(1000L * 60 * 60) // one hour .setRequiredNetworkType(NETWORK_TYPE_ANY) .setPersisted(true) jobScheduler.schedule(builder.build())

これはonCreate()の内側に配置され、私の現在のコードです。しかし、JobScheduler.schedule()onCreate()に入れると、アプリケーションを開くたびにサービスが自動的に実行されることがわかりました。

システムブート後にユーザーがアプリケーションを開くことがない場合でも、サービスを定期的に実行するために、上記のコードを置くのに最適な場所はどこですか?

答えて

1

あなたのジョブは定期的に(1時間に1回)実行されるため、最初に実行されるとJobScheduler.schedule()になりません。は再び呼び出されます。

JobScheduler.schedule()に初めて電話すると、スケジュールされているという事実を登録し、あなたの仕事が一度も実行されていないことが確実なときにのみスケジューリング方法を実行します。

public static final String IS_JOB_FIRST_RUN = "job scheduled"; 

... 

    SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(this); 
    if (preferences.getBoolean(IS_JOB_FIRST_RUN, true)) { 

     // your code 
     JobScheduler.schedule(); 
     preferences.edit().putBoolean(IS_JOB_FIRST_RUN, false).apply(); 
    } 
関連する問題