假设使用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将不再是一个警报通知。
答案 0 :(得分:1)
如果您要取消通过AlarmManager
计划的内容,请在cancel()
上拨打AlarmManager
,将等效的PendingIntent
传递给您用于安排工作在第一位。在这里,通过"等效PendingIntent
",我的意思是:
getActivity()
与getService()
对比getBroadcast()
)Intent
等同于Intent
",我的意思是:
Uri
)您在原始Intent
原始PendingIntent
上设置的所有属性。