1

PendingIntent をパラメーターとして受け取る AlarmManager.setInexactRepeating() メソッドを使用するアプリケーションを作成しています。

setAlarm() メソッドを呼び出すことでこれを開始します

public void setRepeatingAlarm() {

    Intent intent = new Intent(this, AlarmReceiver.class);
    String url = getAssembledUrl();
    intent.putExtra("url", url);
    pendingIntent = PendingIntent.getBroadcast(this, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);

    alarmManager.setInexactRepeating(AlarmManager.RTC_WAKEUP, System.currentTimeMillis(), interval, pendingIntent);

}

stopAlarm() で停止します

private void stopRepeatingAlarm() {

    alarmManager.cancel(pendingIntent);
    pendingIntent.cancel();

}

うまく動作します。ただし、アクティビティが破棄され、ユーザーがアラームを停止することを決定した場合、現在のアクティビティの存続期間中に呼び出されなかった setRepeatingAlarm() メソッドで作成されるため、明らかに保留中のインテントは null です。

これを回避する正しい方法は何ですか?

Activity.onCreate() で保留中のインテントを作成することができ、それでこの問題は解決しますが、保留中のインテントがキャンセルされ、再度作成する必要があるため、アラームを再度開始することはできません (存在しない限り、私が知らない意図がキャンセルされたことを確認する方法)

4

1 に答える 1

1

実際、判明したように

PendingIntent.getBroadcast(this, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);

同じ保留中の意図を返します。意図が同じであれば、私が必要としていたのは

private void stopRepeatingAlarm() {

    if(pendingIntent == null) {
        pendingIntent = PendingIntent.getBroadcast(this, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);
    }

    alarmManager.cancel(pendingIntent);

}
于 2012-08-08T01:55:48.013 に答える