web-dev-qa-db-ja.com

タスクを定期的に実行(1日1回/週1回)

アプリケーションが閉じられている場合でも、定期的に(週に1日1回)何らかのタスク(つまり、Webサイトのニュースページを取得する)を実行します。出来ますか?

41
siemian

はい、そうです、 AlarmManager を見て、繰り返し発生する「アラーム」を設定する必要があります。これは、サービスとは異なり、バックグラウンドで常に実行されるわけではないため、デバイスのバッテリー寿命にとって優れています。アラームは、カスタムコードを実行する broadcast receiver をトリガーします。

最後に、実際の値を設定することもできますが、毎日、半日など、アラームのタイミングの列挙値があります。

良い例は次のSO post:

アラームマネージャーの例

更新

新しい機能がAndroidに追加されました。これを読んでいるなら、今 GcmNetworkManager を調べることをお勧めします。これにより、バッテリーの寿命が最適化され、Lollipop以前のバージョンで動作します。 Lollipop以降では、 JobScheduler を使用できます。 AlarmManagerでこれらのクラスを使用することをお勧めします。

49
Graham Smith

最適なのは GcmNetworkManager だと思います。基本的に、AlarmManagerに必要なものに加えて永続性があるため、ジョブは再起動後に実行を続行できます。

例:

PeriodicTask task = new PeriodicTask.Builder()
        .setService(MyTaskService.class)
        .setTag(TASK_TAG_PERIODIC)
        .setPeriod(5L)
        .build();

mGcmNetworkManager.schedule(task);
13
surlac

別の方法として、現在の週を比較しています:

Calendar cal = Calendar.getInstance();
int currentWeekOfYear = cal.get(Calendar.WEEK_OF_YEAR);

SharedPreferences sharedPreferences= this.getSharedPreferences("appInfo", 0);
int weekOfYear = sharedPreferences.getInt("weekOfYear", 0);

if(weekOfYear != currentWeekOfYear){
    SharedPreferences.Editor editor = sharedPreferences.edit();
    editor.putInt("weekOfYear", currentWeekOfYear);
    editor.commit();
    // Your once a week code here
}

私は、これがAlarmソリューションよりも優れていると主張しているわけではありません。別のアプローチを示しています。

6
aldux