1

毎日午後 2 時にデータを更新するサービスをアプリで作成しようとしています。データをフェッチするサービスをトリガーする繰り返しアラームを設定したいと考えています。これは UI スレッドとは関係なく、アプリが閉じられていても機能するはずです。

サービスを開始できないようです。

アラームを作成するアクティビティのコードは次のとおりです

    Calendar cal = Calendar.getInstance();
    cal.set(Calendar.HOUR_OF_DAY, 20); // HOUR
    cal.set(Calendar.MINUTE, 0); // MIN
    cal.set(Calendar.SECOND, 0); // SEC
    Intent intent = new Intent(Main.this, VenueUpdater.class);
    PendingIntent pintent = PendingIntent.getService(Main.this, 0, intent, 0);
    AlarmManager alarm = (AlarmManager)getSystemService(Context.ALARM_SERVICE);
    alarm.setRepeating(AlarmManager.RTC_WAKEUP, cal.getTimeInMillis(), 30*1000, pintent);

それから私のサービスクラス

public class VenueUpdater extends Service{

@Override
public IBinder onBind(Intent arg0) {
    return null;
}

@Override
public void onCreate() {
    Toast.makeText(this, "Create", Toast.LENGTH_SHORT).show();
    Log.i("SERVICE", "onCreate");
}

@Override
public void onDestroy() {
    Toast.makeText(this, "Destroy", Toast.LENGTH_SHORT).show();
    Log.i("SERVICE", "onDestroy");
}

@SuppressWarnings("deprecation")
@Override
public void onStart(Intent intent, int startid) {
    super.onStart(intent, startid);
    Toast.makeText(this, "Start", Toast.LENGTH_SHORT).show();
    Log.i("SERVICE", "onStart");
}

}

アプリケーションタグを閉じる直前のマニフェストで

 <service android:enabled="true" android:name="services.VenueUpdater" />

</application>

サービスを使用した他の例とコードを確認しましたが、コードは問題ないように見えますが、まだ機能しません。また、同じアラームが複数回作成される可能性があるため、これを達成するためのより良い方法があるかどうか疑問に思っていますが、そうでないことを確認するために使用できる保留中の意図フラグがある可能性があります。

4

2 に答える 2

4

次の例では、アラームが午後 2 時ではなく午後 8 時に鳴るように設定しています。

cal.set(Calendar.HOUR_OF_DAY, 20); // HOUR

アラームが複数回スケジュールされていないことを確認したい場合は、次のように、アラームを設定する前に、以前にスケジュールされたアラームをキャンセルできます。

alarm.cancel(pintent);

また、次の呼び出しAlarmManager:

alarm.setRepeating(AlarmManager.RTC_WAKEUP, cal.getTimeInMillis(), 30*1000, pintent);

アラームが午後 8 時に鳴り、その後は 30 秒ごとに鳴るように設定します。それはあなたが望むものですか?

編集 アラームを 1 日 1 回午後 2 時に繰り返すように設定する方法を示します

1 日 1 回午後 2 時にアラームを繰り返すようにスケジュールするには、次のようにします。

alarm.setRepeating(AlarmManager.RTC_WAKEUP, cal.getTimeInMillis(), AlarmManager.INTERVAL_DAY, pintent);
于 2013-08-11T20:42:03.513 に答える