1

ユーザーが作成でき、ユーザーが無効にできるアラームが 1 つあります。ユーザーがアラームを無効にすると、アラームを使用してキャンセルしAlarmManager、アラーム時刻をどこかに保存します。

ここで、ユーザーがアラームを再度有効にすると、アラームを作成し、アラームに保存された時間を設定します。問題は、保存された時刻でアラームを再作成すると、onReceive()アラームブロードキャストのメソッドが即座に呼び出されることです。

以下のようにアラームを設定しています。

alarmManager.setRepeating(AlarmManager.RTC, time, AlarmManager.INTERVAL_DAY,
    PendingIntent.getBroadcast(
        this, alarmUniqueCode, intentAlarm, PendingIntent.FLAG_UPDATE_CURRENT));

ユーザーが無効をクリックしたときにアラームを無効にする方法:

sender = PendingIntent.getBroadcast(this, 1, intent, 0);
alarmManager.cancel(sender);

以下のように、マニフェスト ファイルにアラーム レシーバーを追加しました。

<receiver
    android:name="com.sign.android.myscheduler.app.AlarmReceiver"
    android:enabled="true"
    android:exported="true" >
</receiver>

もう 1 つの質問: アラームを無効にするときは、cancel メソッドを呼び出します。ブロードキャスト レシーバーも登録解除する必要がありますか? はいの場合、2 つの異なるアラームがある場合はどうなりますか? 1 つのアラームだけに対してブロードキャスト レシーバーの登録を解除するにはどうすればよいですか?

4

1 に答える 1

0

あなたの問題については、過去の時間を設定するとすぐにアラームがトリガーされます

AlarmManager API ドキュメントから:

指定されたトリガー時刻が過去の場合、アラームはすぐにトリガーされ、アラーム カウントは、トリガー時刻が繰り返し間隔に対してどれだけ過去にあるかに応じて異なります。

この場合、保存された時間が過去のものかどうかを最初に確認する必要があります。はいの場合、時間が将来になるまで間隔を追加する必要があります。

コードを次のように変更してみてください。

long now = new Date().getTime();
while (time < now) {
    time += AlarmManager.INTERVAL_DAY;
}
alarmManager.setRepeating(AlarmManager.RTC, time,
    AlarmManager.INTERVAL_DAY, PendingIntent.getBroadcast(this,
    alarmUniqueCode, intentAlarm, PendingIntent.FLAG_UPDATE_CURRENT));

2 番目の質問については、私は本当に答えることができません。しかし、私の経験上、受信機をつけたままでも問題ありません。

于 2014-04-16T06:25:53.700 に答える