サービスに繰り返しアラームを設定しましたが、呼び出されたサービス内からアラームをリセットするのが最も便利であると判断しました。その理由は、サービスがユーザー定義のスケジュール (時間範囲) 内にあるかどうかを確認するためのコードを既に持っているためです。時間範囲外の場合、アラームをリセットして、ユーザーが選択した将来の時間に開始します。多分私はこれに間違ったアプローチをしているかもしれませんが、私はこの質問をそこに出して、あなたがどう思うか見てみましょう.
アクティビティは、繰り返しアラームを作成してサービスを開始します。
//Activity
Calendar cal = Calendar.getInstance();
Intent intent = new Intent(getApplicationContext(), MyService.class);
intent.setData(Uri.parse("MyService://identifier"));
PendingIntent pIntent = PendingIntent.getService(getApplicationContext(), 0, intent, 0);
AlarmManager alarm = (AlarmManager)getSystemService(ALARM_SERVICE);
alarm.setInexactRepeating(AlarmManager.RTC_WAKEUP, cal.getTimeInMillis(),
intervalInMins*60000, pIntent);
サービスには次のようなものがあります。
//Service
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
Uri Action = intent.getData();
try {
if (Action.equals(Uri.parse("MyService://identifier"))) {
//Simplifying the code here: CalculatedOffset is determined from the current time
//and scheduled start time. intervalInMins is read from settings.
if (!WithinSchedule()) {
Calendar cal = Calendar.getInstance();
PendingIntent pIntent = PendingIntent.getService(getApplicationContext(), 0, intent, 0);
AlarmManager alarm = (AlarmManager)getSystemService(ALARM_SERVICE);
alarm.setInexactRepeating(AlarmManager.RTC_WAKEUP, cal.getTimeInMillis() + CalculatedOffset,
intervalInMins*60000, pIntent);
}
}
} catch (NullPointerException np) {
np.printStackTrace();
}
return Service.START_REDELIVER_INTENT;
}
インテントを再利用して、繰り返しアラームをリセットしたいと思っていました。この新しいコードを使用すると、開始時刻になると、複数のアラームが積み重なり、連続して急速に発火します。そのようにスパズアウトするべきではありませんが、スケジュールがリセットされる前と同じように定期的に起動する必要があります。デバッガーでキャッチする必要がありますが、正確な条件をまだ特定できていません。ここでアラームに関する私の理解は完全にずれていますか? これを行うより良い方法はありますか?
補遺: この問題の 1 つは、Android 4.2 の機内モードを回避するために、RootTools を使用してスーパーユーザー権限を取得していることです。これはスケジューリング前は問題ありませんでしたが、アラームがスタックしている間に su が長時間ブロックされているかどうかは疑わしいです。