6

3日間検索しましたが、解決策や同様の問題/質問が他に見つかりませんでした. 契約は次のとおりです。

1 時間でトリガー -> 正常に動作

2時間で発動→1分23秒で消滅

1日でトリガー -> ~11:00で終了

では、なぜ AlarmManager はこれほど予測不可能で、常に早すぎるのでしょうか? または、私は何を間違っていますか?また、正しく機能する別の方法はありますか?

これは、PendingIntent を AlarmManager に登録する方法です (削除されます)。

AlarmManager alarmManager = (AlarmManager)parent.getSystemService(ALARM_SERVICE);
Intent myIntent = new Intent(parent, UpdateKlasRoostersService.class);
PendingIntent pendingIntent = PendingIntent.getService(parent, 0, myIntent, PendingIntent.FLAG_UPDATE_CURRENT);

//Set startdate of PendingIntent so it triggers in 10 minutes
Calendar start = Calendar.getInstance();
start.setTimeInMillis(SystemClock.elapsedRealtime());
start.add(Calendar.MINUTE, 10);

//Set interval of PendingIntent so it triggers every day
Integer interval = 1*24*60*60*1000;

//Cancel any similar instances of this PendingIntent if already scheduled
alarmManager.cancel(pendingIntent);

//Schedule PendingIntent
alarmManager.setRepeating(AlarmManager.ELAPSED_REALTIME_WAKEUP, start.getTimeInMillis(), interval, pendingIntent);
//Old way I used to schedule a PendingIntent, didn't seem to work either
//alarmManager.set(AlarmManager.RTC_WAKEUP, start.getTimeInMillis(), pendingIntent);

誰かが解決策を持っていれば素晴らしいでしょう。助けてくれてありがとう!

更新: 2 時間前は 2 時間間隔でトリガーするように機能しましたが、その後は 1:20 時間後にトリガーされました。それは本当に奇妙になっています。ログファイルでトリガーを追跡し、明日ここに投稿します。

更新: PendingIntent は 3 時間ごとに実行されるようにスケジュールされています。ログの 2 行目から、古いスケジュールされた PendingIntent がまだ実行されているようです。

[2012-5-3 2:15:42 519] Updating Klasroosters
[2012-5-3 4:15:15 562] Updating Klasroosters
[2012-5-3 5:15:42 749] Updating Klasroosters
[2012-5-3 8:15:42 754] Updating Klasroosters
[2012-5-3 11:15:42 522] Updating Klasroosters

しかし、新しいものをスケジュールする前に、スケジュールされた PendingIntent をキャンセルしたと確信しています。また、すべての PendingIntent が同じ方法で再作成されるわけではないため、まったく同じである必要があります。そうでない場合、このスレッドの質問はもはや関係ありません。

4

4 に答える 4

1

カレンダーを使用する場合、カレンダーはミリ秒までの時間を使用することを考慮に入れています。たぶん、ミリ秒フィールドと秒フィールドをゼロに設定して、ドットをオンにする必要があります。

また、1日はこれを使用する方が簡単です

Calendar cal = Calendar.getInstance();
cal.setTimeInMillis(0);
cal.add(Calendar.DAY_OF_MONTH, 1);

また、 getInstance を使用すると、カレンダーの時刻が作成された時刻に設定されないため、時刻を再度設定する必要はありませんか?

于 2012-06-02T21:23:50.477 に答える
1

サービスの onStartCommand が START_NOT_STICKY を返すことを確認してください。そうしないと、自動的に再試行されます。

public class UpdateKlasRoostersService extends Service {
    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        buildUpdate();
        return START_NOT_STICKY;
    }
}
于 2013-09-08T10:43:00.997 に答える
1

書き換え:最終的にあなたのエラーを見ましたが、予測できませんでした。

私はこれを変更しました:

PendingIntent.getService(parent, 0, myIntent, PendingIntent.FLAG_UPDATE_CURRENT);

これに:

PendingIntent.getService(parent, 0, myIntent, PendingIntent.FLAG_CANCEL_CURRENT);

どういうわけか古い意図が放送されているというあなたと同じ仮定の下で。それ以来、まぐれを見ていない…

また、私がそれを見たのは最初の電話のときだけでした。currentもう 1 つのアプローチは、 Calendar オブジェクトを追跡するpreviousことです。間隔が期待したものでない場合は、この「早い」ブロードキャストを無視します。(この方法は、アラームがどのように機能するかを考えると冗長に見えますが、アラームどのように機能するかを考えると、不要な呼び出しを防ぐのに役立ちます...)

他に何か見つけたらお知らせします。

于 2012-06-02T23:16:37.507 に答える