2011-01-15 2 views
3

を働いていないアラームを繰り返すこれは正常に動作します:Androidは

Intent intent = new Intent(HelloAndroid2.this, AlarmReceiver.class); 

    PendingIntent pendingIntent = PendingIntent.getBroadcast(HelloAndroid2.this, 0, 
    intent, PendingIntent.FLAG_ONE_SHOT); 

    AlarmManager alarmManager = (AlarmManager) getSystemService(ALARM_SERVICE); 
    alarmManager.set(AlarmManager.RTC_WAKEUP, System.currentTimeMillis() + (12 * 1000), pendingIntent); 

これは動作しません。私は警報だけを聞いています。問題は何である

Calendar calendar = Calendar.getInstance(); 
    calendar.setTimeInMillis(System.currentTimeMillis()); 
    calendar.add(Calendar.SECOND, 5); 

    alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), 7000, pendingIntent); 

alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, System.currentTimeMillis() + (12 * 1000), 3 * 1000, pendingIntent); 

は私もこの、運を試してみましたか? FLAG_ONE_SHOTためPendingIntent docから

答えて

3

このPendingIntentは 一度だけ使用することができます。設定されている場合、 send()が呼び出された後には が自動的にキャンセルされ、 以降の送信は に失敗します。

pendingIntentが最初に発射された後、だから、それがキャンセルされ、アラームマネージャ経由で送信するための次の試みは

あなたのコードサンプルで見てみるFLAG_UPDATE_CURRENT

+0

これはとても簡単でした。ありがとうございました。 – erdomester

0

を使用してみてくださいに失敗しますorder:

最初のサンプルでは、​​AlarmManager.setを使用しています。これは厳密には1回限りのアラームのためです。はい、1回だけ発生します。 AlarmManager.setを使用する場合は、最後にコードがトリガするべきことは、新鮮なアラーム(新しいPendingIntentも使用する必要があります)を設定することです。

2番目の例では、繰り返しアラームを使用しています。 は、OSがアラームの繰り返しの面を処理するため、この起動ごとに新しいPendingIntentを作成する必要があります。

アラームが3秒ごとに繰り返されるべきではない理由はないので、アラームを処理するために作成したBroadcastReceiverの実装を見ていきます。

正しく実装されていることを確認してください。 onReceive()メソッド内のすべてのコードをコメントアウトし、代わりにログメッセージを書きます。アラームが発生するたびにlogcatにログメッセージが表示されたら、ログメッセージを保持したままコードを追加し、メソッドの最後に別のログメッセージを追加します。これにより、メソッドの実行に要する時間を知ることができます。予期しない副作用を避けるために、アラームが再び発生する前に終了する必要があります。

繰り返しアラームが必要な場合は、AlarmManagerによって設定されたアラームは非常に正確に発生しますが、android.os.Handlerははるかに効率的なアプローチです。