1

我正在制作一个使用 AlarmManager.setInexactRepeating() 方法的应用程序,它将 PendingIntent 作为参数。

我通过调用我的 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() 方法中创建的。

解决这个问题的正确方法是什么?

我可以在 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 回答