3

これはうまくいきます:

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);

これはうまくいきません。時間だけアラームが鳴ります。

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

私もこれを試しましたが、運が悪い:

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

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

何が問題ですか?

4

2 に答える 2

5

FLAG_ONE_SHOTのPendingIntent ドキュメントから:

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

そのため、pendingIntent が最初に起動された後、それはキャンセルされ、アラーム マネージャーを介した次の送信の試行は失敗します。

FLAG_UPDATE_CURRENT を使用してみてください

于 2011-01-15T14:49:01.993 に答える
0

コードサンプルを順番に見てください:

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

2 番目の例では、繰り返しアラームを使用しています。OS がアラームの繰り返しの側面を処理するため、これが発生するたびに新しい PendingIntent を作成する必要はありません。

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

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

余談ですが、繰り返しアラームが必要な場合は、android.os.Handler の方がはるかに効率的なアプローチですが、AlarmManager で設定されたアラームは非常に正確に起動します。

于 2011-07-18T19:25:47.643 に答える