使用报警管理器和广播接收器设置的取消通知
Cancel Notification which has been set using AlarmManager and BroadCast Reciever
在我的 Activity 中,我设置了时间让 AlarmManager 在未来的日期生成通知,并将信息存储在 sqlite 数据库中。通过更改 ids 设置多个通知以通知 notificationManager 后,我在 ListView 中显示信息。
现在我想取消或删除一些通知。例如,我将通知时间设置为 1 小时后,我想在列表视图的 longitemclick 上取消它,但通知生成。
我看到了取消通知栏通知的方法,但不适合我的情况。我想在它生成之前取消通知。
我怎样才能做到这一点?
这是我调用通知的代码:
custom = new CustomDateTimePicker(noticall.this,new CustomDateTimePicker.ICustomDateTimeListener() {
@Override
public void onCancel() {
finish();
}
@Override
public void onSet(Dialog dialog, Calendar calendarSelected,Date dateSelected, int year, String monthFullName,
String monthShortName, int monthNumber, int date,
String weekDayFullName, String weekDayShortName,
int hour24, int hour12, int min, int sec,
String AM_PM) {
Calendar calendar = Calendar.getInstance();
calendar.set(year, monthNumber, date, hour24, min, 0);
long when = calendar.getTimeInMillis(); // notification time
myIntent = new Intent(noticall.this, MyReceiver.class);
pendingIntent = PendingIntent.getBroadcast(noticall.this, 0, myIntent,0);
alarmManager = (AlarmManager)getSystemService(ALARM_SERVICE);
alarmManager.set(AlarmManager.RTC, calendar.getTimeInMillis(), pendingIntent);
Date = calendarSelected.get(Calendar.DAY_OF_MONTH) + "/" + (monthNumber+1) + "/" +year;
Time = hour12 + ":" + min + " " + AM_PM;
setlisto(Date);
Intent intent = getIntent();
finish();
startActivity(intent);
Toast.makeText(noticall.this,"Record Added", Toast.LENGTH_SHORT).show();
}
});
我的收件人CLASS:
public class MyReceiver extends BroadcastReceiver{
@Override
public void onReceive(Context context, Intent intent)
{
/*Intent service1 = new Intent(context, MyAlarmService.class);
context.startService(service1);*/
Log.i("App", "called receiver method");
try{
Utils.generateNotification(context);
}catch(Exception e){
e.printStackTrace();
}
}
}
工具class:
public class Utils {
//int k = noticall.in2;
static int i=0;
static long[] vibrate = { 1000, 1000, 1000, 1000, 1000 };
public static NotificationManager mManager;
@SuppressWarnings("static-access")
public static void generateNotification(Context context){
mManager = (NotificationManager) context.getSystemService(context.NOTIFICATION_SERVICE);
int j=i+=1;
Intent intent1 = new Intent(context,Sipdroid.class);
Notification notification = new Notification(R.drawable.yel1," NOTIFICATION!", System.currentTimeMillis());
notification.defaults |= Notification.DEFAULT_SOUND;
notification.defaults |= Notification.DEFAULT_VIBRATE;
notification.defaults |= Notification.DEFAULT_LIGHTS;
intent1.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP| Intent.FLAG_ACTIVITY_CLEAR_TOP);
PendingIntent pendingNotificationIntent = PendingIntent.getActivity(context,0, intent1,PendingIntent.FLAG_UPDATE_CURRENT);
notification.flags |= Notification.FLAG_AUTO_CANCEL;
notification.setLatestEventInfo(context, "xxxx", "xx "+noticall.Names, pendingNotificationIntent);
Log.i("increeeee", noticall.incre+"");
mManager.notify(j, notification); // for multiple notifications... change 0 to no of notification....
}
}
在我这里activity我想取消设置的通知:
this.getListView().setOnItemLongClickListener(new OnItemLongClickListener() {
public boolean onItemLongClick(AdapterView<?> parent, View v, int position, long id) {
Log.w("DELETED", " DELETED");
// code here to delete specific notification or pendingIntent or alarmmanager
}
});
我试过这段代码,但它适用于取消所有待定的取消意图我想取消特定的待定意图:
public void unsetAlarm(View v) {
myIntent = new Intent(noticall.this, MyReceiver.class);
pendingIntent = PendingIntent.getBroadcast(noticall.this, 0, myIntent,0);
alarmManager = (AlarmManager)getSystemService(ALARM_SERVICE);
alarmManager.cancel(pendingIntent);
Log.v("ahooooo", "cancelling notification");
}
如何取消特定的 pendingIntents?
您无法从警报管理器获得实际的未决意图,但您可以取消它。
使用您之前使用的完全相同的数据和 ID 重新创建意图,然后将意图传递给 AlarmManager 的取消功能,这将允许您取消通知。
AlarmManager manager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
manager.cancel(pendingIntent);
其中 pendingIntent 是您要取消的意图。
一些参考链接:-
How to get and cancel a PendingIntent?
Cancelling a PendingIntent
好的,我必须自己解决我的问题。我们可以管理多个 pendingIntent
public void setAlarm(long timu,int id2){
myIntent = new Intent(noticall.this, MyReceiver.class);
pendingIntent = PendingIntent.getBroadcast(noticall.this, id2, myIntent,0);
alarmManager = (AlarmManager)getSystemService(ALARM_SERVICE);
alarmManager.set(AlarmManager.RTC, timu, pendingIntent);
}
public void unsetAlarm(View v,int id) {
myIntent = new Intent(noticall.this, MyReceiver.class);
pendingIntent = PendingIntent.getBroadcast(noticall.this, id, myIntent,0);
alarmManager = (AlarmManager)getSystemService(ALARM_SERVICE);
alarmManager.cancel(pendingIntent);
}
我在创建 pendingIntents 时分配了相同的 ID,为了删除,我读取了分配的 ID 并取消了 alarmManager,以便在它触发之前关闭通知。
as `pendingIntent = PendingIntent.getBroadcast(this, id, myIntent,0);
id 是 PendingIntent 的请求代码,我们可以跟踪它,要取消所需的 PendingIntent,只需传递要取消的 id。
可能会帮助某人。干杯。快乐 Android 编码。
在我的 Activity 中,我设置了时间让 AlarmManager 在未来的日期生成通知,并将信息存储在 sqlite 数据库中。通过更改 ids 设置多个通知以通知 notificationManager 后,我在 ListView 中显示信息。
现在我想取消或删除一些通知。例如,我将通知时间设置为 1 小时后,我想在列表视图的 longitemclick 上取消它,但通知生成。
我看到了取消通知栏通知的方法,但不适合我的情况。我想在它生成之前取消通知。
我怎样才能做到这一点?
这是我调用通知的代码:
custom = new CustomDateTimePicker(noticall.this,new CustomDateTimePicker.ICustomDateTimeListener() {
@Override
public void onCancel() {
finish();
}
@Override
public void onSet(Dialog dialog, Calendar calendarSelected,Date dateSelected, int year, String monthFullName,
String monthShortName, int monthNumber, int date,
String weekDayFullName, String weekDayShortName,
int hour24, int hour12, int min, int sec,
String AM_PM) {
Calendar calendar = Calendar.getInstance();
calendar.set(year, monthNumber, date, hour24, min, 0);
long when = calendar.getTimeInMillis(); // notification time
myIntent = new Intent(noticall.this, MyReceiver.class);
pendingIntent = PendingIntent.getBroadcast(noticall.this, 0, myIntent,0);
alarmManager = (AlarmManager)getSystemService(ALARM_SERVICE);
alarmManager.set(AlarmManager.RTC, calendar.getTimeInMillis(), pendingIntent);
Date = calendarSelected.get(Calendar.DAY_OF_MONTH) + "/" + (monthNumber+1) + "/" +year;
Time = hour12 + ":" + min + " " + AM_PM;
setlisto(Date);
Intent intent = getIntent();
finish();
startActivity(intent);
Toast.makeText(noticall.this,"Record Added", Toast.LENGTH_SHORT).show();
}
});
我的收件人CLASS:
public class MyReceiver extends BroadcastReceiver{
@Override
public void onReceive(Context context, Intent intent)
{
/*Intent service1 = new Intent(context, MyAlarmService.class);
context.startService(service1);*/
Log.i("App", "called receiver method");
try{
Utils.generateNotification(context);
}catch(Exception e){
e.printStackTrace();
}
}
}
工具class:
public class Utils {
//int k = noticall.in2;
static int i=0;
static long[] vibrate = { 1000, 1000, 1000, 1000, 1000 };
public static NotificationManager mManager;
@SuppressWarnings("static-access")
public static void generateNotification(Context context){
mManager = (NotificationManager) context.getSystemService(context.NOTIFICATION_SERVICE);
int j=i+=1;
Intent intent1 = new Intent(context,Sipdroid.class);
Notification notification = new Notification(R.drawable.yel1," NOTIFICATION!", System.currentTimeMillis());
notification.defaults |= Notification.DEFAULT_SOUND;
notification.defaults |= Notification.DEFAULT_VIBRATE;
notification.defaults |= Notification.DEFAULT_LIGHTS;
intent1.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP| Intent.FLAG_ACTIVITY_CLEAR_TOP);
PendingIntent pendingNotificationIntent = PendingIntent.getActivity(context,0, intent1,PendingIntent.FLAG_UPDATE_CURRENT);
notification.flags |= Notification.FLAG_AUTO_CANCEL;
notification.setLatestEventInfo(context, "xxxx", "xx "+noticall.Names, pendingNotificationIntent);
Log.i("increeeee", noticall.incre+"");
mManager.notify(j, notification); // for multiple notifications... change 0 to no of notification....
}
}
在我这里activity我想取消设置的通知:
this.getListView().setOnItemLongClickListener(new OnItemLongClickListener() {
public boolean onItemLongClick(AdapterView<?> parent, View v, int position, long id) {
Log.w("DELETED", " DELETED");
// code here to delete specific notification or pendingIntent or alarmmanager
}
});
我试过这段代码,但它适用于取消所有待定的取消意图我想取消特定的待定意图:
public void unsetAlarm(View v) {
myIntent = new Intent(noticall.this, MyReceiver.class);
pendingIntent = PendingIntent.getBroadcast(noticall.this, 0, myIntent,0);
alarmManager = (AlarmManager)getSystemService(ALARM_SERVICE);
alarmManager.cancel(pendingIntent);
Log.v("ahooooo", "cancelling notification");
}
如何取消特定的 pendingIntents?
您无法从警报管理器获得实际的未决意图,但您可以取消它。 使用您之前使用的完全相同的数据和 ID 重新创建意图,然后将意图传递给 AlarmManager 的取消功能,这将允许您取消通知。
AlarmManager manager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
manager.cancel(pendingIntent);
其中 pendingIntent 是您要取消的意图。
一些参考链接:- How to get and cancel a PendingIntent?
Cancelling a PendingIntent
好的,我必须自己解决我的问题。我们可以管理多个 pendingIntent
public void setAlarm(long timu,int id2){
myIntent = new Intent(noticall.this, MyReceiver.class);
pendingIntent = PendingIntent.getBroadcast(noticall.this, id2, myIntent,0);
alarmManager = (AlarmManager)getSystemService(ALARM_SERVICE);
alarmManager.set(AlarmManager.RTC, timu, pendingIntent);
}
public void unsetAlarm(View v,int id) {
myIntent = new Intent(noticall.this, MyReceiver.class);
pendingIntent = PendingIntent.getBroadcast(noticall.this, id, myIntent,0);
alarmManager = (AlarmManager)getSystemService(ALARM_SERVICE);
alarmManager.cancel(pendingIntent);
}
我在创建 pendingIntents 时分配了相同的 ID,为了删除,我读取了分配的 ID 并取消了 alarmManager,以便在它触发之前关闭通知。
as `pendingIntent = PendingIntent.getBroadcast(this, id, myIntent,0);
id 是 PendingIntent 的请求代码,我们可以跟踪它,要取消所需的 PendingIntent,只需传递要取消的 id。
可能会帮助某人。干杯。快乐 Android 编码。