1

サービスに繰り返しアラームを設定しましたが、呼び出されたサービス内からアラームをリセットするのが最も便利であると判断しました。その理由は、サービスがユーザー定義のスケジュール (時間範囲) 内にあるかどうかを確認するためのコードを既に持っているためです。時間範囲外の場合、アラームをリセットして、ユーザーが選択した将来の時間に開始します。多分私はこれに間違ったアプローチをしているかもしれませんが、私はこの質問をそこに出して、あなたがどう思うか見てみましょう.

アクティビティは、繰り返しアラームを作成してサービスを開始します。

//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 が長時間ブロックされているかどうかは疑わしいです。

4

1 に答える 1

0

アラームを受信するサービス内でインテントを再利用すると機能します。繰り返しアラームの使用から、サービスが呼び出されるたびに再起動される単発アラームに切り替えました。残念ながら、これはアラーム スタックの問題を解決しませんでした。犯人は間違いなくsuブロッキングです。RootTools または su 自体である可能性があります。ライブラリを 2.6 から 3.x に更新して、違いがあるかどうかを確認する必要があります。

于 2013-09-09T15:09:00.030 に答える