1

这是设置和删除通知的代码。如果您需要更多详细信息,请告诉我。堆栈溢出的唯一解决方案是关于等待的意图是相同的。我已经尝试过这个解决方案,但没有奏效。无法使用闹铃管理器取消待处理意图

public void setAlarm() throws java.text.ParseException { 
    RealmResults<Reminder> realmResults = getAllLatest(); 

    AlarmManager alarmMgr = (AlarmManager) getSystemService(Context.ALARM_SERVICE); 

    Reminder reminder = getLatestReminder(realmResults); 
    int hour = convertTimeToHoursAndMinutes(reminder.getReminderTime()).getHours(); 
    int minutes = convertTimeToHoursAndMinutes(reminder.getReminderTime()).getMinutes(); 
    PendingIntent pendingIntent = getPendingIntentFromReminder(reminder); 
    Log.v("Reminder is: ", String.valueOf(reminder)); 
    Calendar calendar = Calendar.getInstance(); 
    //calendar.setTimeZone(TimeZone.getTimeZone()); 
    calendar.setTimeInMillis(System.currentTimeMillis()); 
    calendar.set(Calendar.HOUR_OF_DAY, hour); 
    calendar.set(Calendar.MINUTE, minutes); 


    alarmMgr.setRepeating(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), AlarmManager.INTERVAL_DAY , pendingIntent); 
} 
private PendingIntent getPendingIntentFromReminder(Reminder reminder) throws ParseException { 
    int hour = convertTimeToHoursAndMinutes(reminder.getReminderTime()).getHours(); 
    int minutes = convertTimeToHoursAndMinutes(reminder.getReminderTime()).getMinutes(); 
    Intent intent = new Intent(this, MyReceiver.class); 
    intent.setAction(reminder.getName()); 
    Uri data = Uri.withAppendedPath(Uri.parse("TYS"), 
      String.valueOf(reminder.getId())); 
    intent.setData(data); 
    Calendar calendar = Calendar.getInstance(); 
    //calendar.setTimeZone(TimeZone.getTimeZone()); 
    calendar.setTimeInMillis(System.currentTimeMillis()); 
    calendar.set(Calendar.HOUR_OF_DAY, hour); 
    calendar.set(Calendar.MINUTE, minutes); 
    //Log.v("Test", calendar.getTimeZone().toString()); 
    // Log.v("Hours to show", String.valueOf(hour)); 
    // Log.v("Minutes to show", String.valueOf(minutes)); 
    intent.putExtra("reminderTitle", reminder.getName()); 
    // Log.v("Reminder Name", reminder.getName()); 
    intent.putExtra("notificationType", 1); 
    intent.putExtra("reminderId", String.valueOf(reminder.getId())); 
    intent.putExtra("reminderSubtitle", reminder.getSubTitle()); 
    intent.setAction(Long.toString(System.currentTimeMillis())); 
    Log.v("set Alarm", String.valueOf(intent)); 
    PendingIntent alarmIntent = PendingIntent.getBroadcast(this, 0, intent, 0); 
    return alarmIntent; 
} 

public void deleteReminderIntent(Reminder reminder) throws ParseException { 
    Log.v("deleteReminderIntent", String.valueOf(reminder)); 
    AlarmManager alarmMgr = (AlarmManager) getSystemService(Context.ALARM_SERVICE); 
    PendingIntent pendingIntent =getPendingIntentFromReminder(reminder); 
    alarmMgr.cancel(pendingIntent); 
    pendingIntent.cancel(); 
    //alarmMgr.cancel(temp); 
    // alarmMgr.cancel(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), AlarmManager.INTERVAL_DAY, alarmIntent); 
} 

回答

1

getPendingIntentFromReminder()您设置的ACTIONIntent到当前时间。当您拨打方法取消PendingIntent以取消您的闹钟时,当前时间不同,因此ACTION将与用于设置闹钟的PendingIntent不匹配。

为了取消警报,您需要使用一个Intent,它与您用于设置警报的Intent匹配。在Intent以下参数必须匹配:

  • ACTION
  • 类别
  • DATA
  • COMPONENT

Intent任何 “额外” 被忽略,所以他们并不需要比赛。

欲了解更多详情,请参见https://stackoverflow.com/a/29590084/769265Is it possible to create multiple PendingIntents with the same requestCode and different extras?

相关问题