Android - 在显示之前删除或取消通知

时间:2016-09-09 16:40:16

标签: java android notifications

假设使用AlarmManager的通知是在特定日期设置的。如果我想在按钮之前删除该通知,甚至在它出现之前该怎么办?如果我没有弄错,NotificationManager.cancel(id)方法将取消当前显示的通知。如果我想在它出现之前删除它怎么办?就像删除arraylist中的项目或如何删除数据库中的行一样。

示例我有一个Person对象id,name,每次向数据库添加Person时,都会在指定日期设置Notification

以下是使用指定日期的日历实例和人物对象调用的设置通知方法:

 public void setNotification(Calendar calendar,Person person){
    AlarmManager alertManager = (AlarmManager)getSystemService(ALARM_SERVICE);
    Intent intent = new Intent();
    intent.setAction("android.media.action.DISPLAY_NOTIFICATION");
    intent.addCategory("android.intent.category.DEFAULT");
    intent.putExtra("myTag",person);

    PendingIntent pendingIntent = PendingIntent.getBroadcast(this, person.getId(), intent, PendingIntent.FLAG_ONE_SHOT);
    alertManager.setExact(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), pendingIntent);
}

我的闹钟接收器类(是的,我正在实现DAO设计模式。我有一个PersonDao和PersonDaoImpl,后者是一个单例类):

public class AlarmReceiver extends BroadcastReceiver {
final static String GROUP_KEY = "GROUP_KEY";

@Override
public void onReceive(Context context, Intent intent) {
    //retrieve info:
    PersonDAO personDao = PersonDAOImpl.getInstance(context);
    Person person = (Person)intent.getSerializableExtra("myTag");
    String name = person.getName();
    long[] vibrationPattern = {0, 300, 0, 300};

    Intent notificationIntent = new Intent(context, MainActivity.class);
    TaskStackBuilder stackBuilder = TaskStackBuilder.create(context);
    stackBuilder.addParentStack(ViewDetails.class);
    stackBuilder.addNextIntent(notificationIntent);

    int requestCode = person.getId();
    PendingIntent pendingIntent = stackBuilder.getPendingIntent(requestCode, PendingIntent.FLAG_UPDATE_CURRENT);
NotificationCompat.Builder builder = new NotificationCompat.Builder(context);
    Notification notification = builder.setContentTitle("Deadline due today")
            .setContentText("name: " + name)
            .setTicker(name+"'s debt is due today")
            .setSmallIcon(R.mipmap.ic_launcher)
            .setPriority(Notification.PRIORITY_MAX)

            .setContentIntent(pi)
            .build();

    NotificationManager notificationManager = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
    notificationManager.notify(requestCode, notification);


}

警报接收器上设置的日期示例是2016年9月12日下午3:00。当前日期是2016年10月10日。我想要做的是当我删除数据库中的人时,通知也将被删除/取消因此,2016年9月12日下午3:00将不再是一个警报通知。

1 个答案:

答案 0 :(得分:1)

如果您要取消通过AlarmManager计划的内容,请在cancel()上拨打AlarmManager,将等效的PendingIntent传递给您用于安排工作在第一位。在这里,通过"等效PendingIntent",我的意思是:

  • 相同的操作(例如,getActivity()getService()对比getBroadcast()
  • 相同的请求代码(这些方法的第二个参数)
  • 等效Intent

等同于Intent",我的意思是:

  • 相同的组件
  • 同样的行动
  • 相同的MIME类型
  • 相同类别
  • 相同的数据(Uri

您在原始Intent原始PendingIntent上设置的所有属性。