取消相关服务和PendingIntent后,AlarmManager仍会触发警报

时间:2014-06-14 20:00:13

标签: android android-service android-pendingintent android-alarms

我有一项服务,使用PendinIntentAlarmManager在固定的时间段后启动另一项活动。

以下是该服务的相关代码:

       Calendar cal = Calendar.getInstance();  //Create a calendar
       cal.add(Calendar.MINUTE, 1);         //Add the set minutes to the alarm

       Intent dialogIntent = new Intent(this, alarmRingLayout.class);
       PendingIntent pendingIntent = PendingIntent.getActivity(this, 1234, dialogIntent, PendingIntent.FLAG_CANCEL_CURRENT);

       AlarmManager am = (AlarmManager)getSystemService(Activity.ALARM_SERVICE);
       am.set(AlarmManager.RTC_WAKEUP, cal.getTimeInMillis(), pendingIntent);

当服务启动时,我还设置了一个通知,其中包含一个可以取消服务的按钮,但用户不希望该活动启动。 点击“取消”按钮,会调用stopService()

stopService(new Intent(StopPowerNapAlarmService.this, PowerNapAlarmService.class));

onDestroy()有以下代码取消通知并调用stopSelf() 它还尝试取消PendingIntentAlarmManager

问题是即使在调用onDestroy之后,活动也会打开。我相信PendingIntent和/或AlarmManager不会被取消。

以下是onDestroy()的代码:

   @Override
   public void onDestroy() {
       Toast.makeText(this, "Alarm Finished", Toast.LENGTH_SHORT).show();
       CancelNotification(this, 0);

       //Cancel the pending intent and AlarmManager
       Intent myntent = new Intent(PowerNapAlarmService.this, PowerNapAlarmService.class);
       PendingIntent pendingIntent = PendingIntent.getBroadcast(this,
              1234, myntent, PendingIntent.FLAG_UPDATE_CURRENT);
       pendingIntent.cancel();
       AlarmManager am = (AlarmManager) this.getSystemService(Context.ALARM_SERVICE);
       am.cancel(pendingIntent);

       stopSelf();
   }

这里出了什么问题?

1 个答案:

答案 0 :(得分:2)

  

这里出了什么问题?

您的Intent个对象不同,因此您的PendingIntent个对象不同。反过来,这意味着您正在处理不同的警报。第一个Intent指向alarmRingLayout.class个活动。第二个Intent指向一个奇怪名为BroadcastReceiver的{​​{1}}。

如果您想要PowerNapAlarmService cancel()警报,请为alarmRingLayout创建一个PendingIntent活动,并将其与alarmRingLayout一起使用。

另外,请在cancel()中删除stopSelf(),因为这不是必需的,可能会导致问题。