2012-06-02 8 views
6

私は3日前に検索しましたが、他の場所で解決策や類似の問題/質問が見つかりませんでした。ここで契約です: - >は2時間で正しいAlarmManagerがPendingIntentをトリガーするのが遅すぎる

トリガーに動作します - > 1で1時23

トリガーで一日のゴーズ - 1時間で

トリガー>でのゴーズ〜11:00

なぜAlarmManagerは予測できないのですか?または私は何を間違っているのですか?それが正しく動作するように別の方法がありますか?

これは私がAlarmManager(ストリップダウン)で私のPendingIntentを登録する方法です:

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時間ごとに実行されるようにスケジュールされています。私は新しいものをスケジュールする前に、私が予定さ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は同じ方法で再作成されないので、まったく同じにする必要があります。そうでない場合、このスレッドの質問はもはや関連しません。

+1

あなたの問題を再現することはできません。ちょうど2時間、1日も前進させるために「スタート」をどのように変更するのですか? – Sam

+1

ログファイルを追加して、おそらく古いPendingIntentがまだ実行中であることがわかりました。 – Wezelkrozum

+0

私も同じ問題を抱えていますが、実際の解決策はありますか? – david

答えて

1

カレンダーを使用している場合は、カレンダーがMilli秒までの時間を使用していることを考慮しています。多分、ミリ秒の秒フィールドと秒フィールドをゼロに設定して、ドット上に表示する必要があります。

また、一日のために、あなたがたgetInstanceは、それはそれが作成された時刻にカレンダーの時間を設定していない使用する場合に必要性があってはならないので、また、この

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

を使用することが容易になるだろうもう一度時間を設定しますか?

+1

ドキュメントを参照すると、SystemClock.elapsedRealtime()は実際の時刻ではなく、起動時からの時刻です。さらに、私はsetTimeInMillis(0)呼び出しが必要であるとは考えていません。なぜなら、あなたは今から1日目で、1エポック(1年前)から1日目ではないからです。 –

+1

しかし、実際の時間ではなく1日を間隔として使用していると思いますか? – FabianCook

+1

ええ、私はこの問題が 'Calendar'を使って設定されたトリガ時間であると仮定しています。 1日の間隔は 'Integer'を使って定義されており、うまくいくはずです。 –

1

書き換え:私は最終的にあなたのエラーを見ましたが、予期せずに。

私は、この変更されました:何とか古い意図が放送であることを、あなたと同じ仮定の下

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

:これまで

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

を。私はそれ以来、ウサギを見たことがありません...

また私はそれが私の最初の呼び出し中だった唯一の時間を見た。別のアプローチは、間隔が期待どおりでなく、この「初期」ブロードキャストを無視する場合、currentprevious Calendarオブジェクトを追跡することです。(この方法が検討冗長思えますが、アラームは仕事は、それがアラームが働いある方法を検討するこれらの余分な呼び出しを防ぐことができますべき...どのように)助け

希望は、私が見つけた場合、あなたが知ってもらおう他に何か。

+1

あなたの努力に感謝しますが、私はこれをすでにやっています。このデータを分析すると、PendingIntentが適時に起動されるはずですが、そうではありません。それが問題です。 – Wezelkrozum

+1

ご迷惑をおかけして申し訳ありません...新しいデータを投稿する際に私にタグを付けてください。 – Sam

+1

質問をログファイルで更新しました – Wezelkrozum

1

私はこの質問が少し古いことを知っていますが、私はこの同じ問題を自分で持っていました。メソッドの外にCalendar変数を宣言しようとすると、うまく再生されず、アラームが早く消えてしまうことが分かりました。あなたのクラスは削除されているので、カレンダーインスタンスをどこで呼び出すのかを正確に伝えるのは難しいです。

私はそのように設定している場合、それは適切な時期に解雇でしょうに:

protected void nextAlarm(Context context, int seconds){ 
    Calendar nextAlarm = Calendar.getInstance(); 

    Intent intent = new Intent(context, MyClass.class); 
    PendingIntent pending = PendingIntent.getBroadcast(context, MainActivity.REPEATING_ALARM, intent, PendingIntent.FLAG_CANCEL_CURRENT); 

    AlarmManager amanager = (AlarmManager)context.getSystemService(Context.ALARM_SERVICE); 
    nextAlarm.add(Calendar.SECOND, seconds); 

    amanager.set(AlarmManager.RTC_WAKEUP, nextAlarm.getTimeInMillis(), pending); 

} 
+1

正直言って私はそれが修正ではありません。メソッド内でカレンダーを作成しています。しかし私はPendingIntentを検索する方法に違いがあることを知っています。私はgetServiceメソッドを使っていますが、getBroadcastメソッドを使用します。 – Wezelkrozum

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; 
    } 
} 
+1

私のサービスは継続しようとしていますか? – Wezelkrozum