在 alertdialog 之后使用 alarmManager.cancel 删除警报
Deleting an alarm with alarmManager.cancel after alertdialog
我在列表项中有一个用于删除该项目的按钮。当有一个警报链接到该项目时,我也想删除警报。
要删除项目,我会显示一个警告对话框,并在肯定按钮中使用删除功能:
builder.setPositiveButton("DELETE", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
DeleteList del = new DeleteList();
del.execute(listId);
}
});
但是我也需要删除闹钟,问题是闹钟设置在另一个activity。我有 PendingIntent 的唯一 ID,但我无法创建 PendingIntent,因为我处于静态上下文中。
如果我这样做:
AddListActivityFragment.deleteAlarmS(alarmId);
我得到无法从静态上下文中引用非静态方法。
如果我这样做:
Intent resultIntent = new Intent(AddListActivity.this, MainActivity.class);
PendingIntent deleteIntent = PendingIntent.getBroadcast(AddListActivity.this, Integer.parseInt(alarmId), resultIntent, PendingIntent.FLAG_NO_CREATE);
if(deleteIntent != null) {
AlarmManager alarmManager = (AlarmManager) AddListActivity.this.getSystemService(Context.ALARM_SERVICE);
alarmManager.cancel(deleteIntent);
deleteIntent.cancel();
}
我得到 "AddListActivity is not an enclosing class"。
我该如何解决这个问题?我怎样才能取消闹钟?我是否使用 AddListActivity 收到的 ID 发送了一些广播?
谢谢
感谢 qbix,我设法使 AddListActivityFragment 中的方法静态化。但是还是没有取消闹钟。
如何在AddListActivityFragment中设置闹钟:
private void scheduleNotification(Notification notification, long delay, int alarmId) {
Intent notificationIntent = new Intent(mContext, NotificationPublisher.class);
notificationIntent.putExtra(NotificationPublisher.NOTIFICATION_ID, alarmId);
notificationIntent.putExtra(NotificationPublisher.NOTIFICATION, notification);
PendingIntent pendingIntent = PendingIntent.getBroadcast(mContext, alarmId, notificationIntent, PendingIntent.FLAG_ONE_SHOT);
Log.v("alarm id", "alarmid = " + alarmId);
long futureInMillis = SystemClock.elapsedRealtime() + delay;
AlarmManager alarmManager = (AlarmManager) mContext.getSystemService(Context.ALARM_SERVICE);
alarmManager.set(AlarmManager.ELAPSED_REALTIME_WAKEUP, futureInMillis, pendingIntent);
}
private Notification getNotification(String content, String subText, int alarmId) {
Uri uri= RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);
long[] vib = new long[]{1000L, 1000L, 1000L, 1000L};
Intent resultIntent = new Intent(mContext, MainActivity.class);
PendingIntent resultPendingIntent =
PendingIntent.getActivity(
mContext,
alarmId,
resultIntent,
PendingIntent.FLAG_UPDATE_CURRENT
);
NotificationCompat.Builder builder = new NotificationCompat.Builder(mContext);
builder.setContentTitle("To do!");
builder.setContentText(content);
builder.setSubText(subText);
builder.setSound(uri);
builder.setVibrate(vib);
builder.setSmallIcon(R.drawable.ic_add_white_24dp);
builder.setAutoCancel(true);
builder.setContentIntent(resultPendingIntent);
return builder.build();
}
闹钟设置为:
scheduleNotification(getNotification(title, subText, alarmId), delay, alarmId);
我如何尝试取消闹钟:
public static void deleteAlarm(String alarmId){
Toast.makeText(mContext, "delete alarm active", Toast.LENGTH_SHORT).show();
Log.v("alarm id delete", "alarmid = " + alarmId);
Intent resultIntent = new Intent(mContext, NotificationPublisher.class);
PendingIntent deleteIntent = PendingIntent.getBroadcast(mContext, Integer.parseInt(alarmId), resultIntent, PendingIntent.FLAG_NO_CREATE);
if(deleteIntent != null) {
Toast.makeText(mContext, "Alarm deleted", Toast.LENGTH_SHORT).show();
AlarmManager alarmManager = (AlarmManager) mContext.getSystemService(Context.ALARM_SERVICE);
alarmManager.cancel(deleteIntent);
deleteIntent.cancel();
}
}
"delete alarm active" Toast 出现,alarmId 是正确的。但是 Toast "alarm deleted" 没有显示,警报仍然响起。 PendingIntent 不一样吗?
谢谢
在您的 AddListActivity
中,声明类型为 Context
的私有静态成员:
private static Context mContext;
在AddListActivity
的onCreate()
方法中,初始化:
mContext = this;
在构建PendingIntent
和取消闹钟的代码块中,将AddListActivity.this
替换为mContext
。
我解决了。
显然 PendingIntent 需要相同的标志,所以当我在 deleteAlarm 方法中将其更改为 PendingIntent.FLAG_ONE_SHOT 时,它起作用了。
感谢您的帮助。
我在列表项中有一个用于删除该项目的按钮。当有一个警报链接到该项目时,我也想删除警报。 要删除项目,我会显示一个警告对话框,并在肯定按钮中使用删除功能:
builder.setPositiveButton("DELETE", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
DeleteList del = new DeleteList();
del.execute(listId);
}
});
但是我也需要删除闹钟,问题是闹钟设置在另一个activity。我有 PendingIntent 的唯一 ID,但我无法创建 PendingIntent,因为我处于静态上下文中。
如果我这样做:
AddListActivityFragment.deleteAlarmS(alarmId);
我得到无法从静态上下文中引用非静态方法。
如果我这样做:
Intent resultIntent = new Intent(AddListActivity.this, MainActivity.class);
PendingIntent deleteIntent = PendingIntent.getBroadcast(AddListActivity.this, Integer.parseInt(alarmId), resultIntent, PendingIntent.FLAG_NO_CREATE);
if(deleteIntent != null) {
AlarmManager alarmManager = (AlarmManager) AddListActivity.this.getSystemService(Context.ALARM_SERVICE);
alarmManager.cancel(deleteIntent);
deleteIntent.cancel();
}
我得到 "AddListActivity is not an enclosing class"。
我该如何解决这个问题?我怎样才能取消闹钟?我是否使用 AddListActivity 收到的 ID 发送了一些广播?
谢谢
感谢 qbix,我设法使 AddListActivityFragment 中的方法静态化。但是还是没有取消闹钟。
如何在AddListActivityFragment中设置闹钟:
private void scheduleNotification(Notification notification, long delay, int alarmId) {
Intent notificationIntent = new Intent(mContext, NotificationPublisher.class);
notificationIntent.putExtra(NotificationPublisher.NOTIFICATION_ID, alarmId);
notificationIntent.putExtra(NotificationPublisher.NOTIFICATION, notification);
PendingIntent pendingIntent = PendingIntent.getBroadcast(mContext, alarmId, notificationIntent, PendingIntent.FLAG_ONE_SHOT);
Log.v("alarm id", "alarmid = " + alarmId);
long futureInMillis = SystemClock.elapsedRealtime() + delay;
AlarmManager alarmManager = (AlarmManager) mContext.getSystemService(Context.ALARM_SERVICE);
alarmManager.set(AlarmManager.ELAPSED_REALTIME_WAKEUP, futureInMillis, pendingIntent);
}
private Notification getNotification(String content, String subText, int alarmId) {
Uri uri= RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);
long[] vib = new long[]{1000L, 1000L, 1000L, 1000L};
Intent resultIntent = new Intent(mContext, MainActivity.class);
PendingIntent resultPendingIntent =
PendingIntent.getActivity(
mContext,
alarmId,
resultIntent,
PendingIntent.FLAG_UPDATE_CURRENT
);
NotificationCompat.Builder builder = new NotificationCompat.Builder(mContext);
builder.setContentTitle("To do!");
builder.setContentText(content);
builder.setSubText(subText);
builder.setSound(uri);
builder.setVibrate(vib);
builder.setSmallIcon(R.drawable.ic_add_white_24dp);
builder.setAutoCancel(true);
builder.setContentIntent(resultPendingIntent);
return builder.build();
}
闹钟设置为:
scheduleNotification(getNotification(title, subText, alarmId), delay, alarmId);
我如何尝试取消闹钟:
public static void deleteAlarm(String alarmId){
Toast.makeText(mContext, "delete alarm active", Toast.LENGTH_SHORT).show();
Log.v("alarm id delete", "alarmid = " + alarmId);
Intent resultIntent = new Intent(mContext, NotificationPublisher.class);
PendingIntent deleteIntent = PendingIntent.getBroadcast(mContext, Integer.parseInt(alarmId), resultIntent, PendingIntent.FLAG_NO_CREATE);
if(deleteIntent != null) {
Toast.makeText(mContext, "Alarm deleted", Toast.LENGTH_SHORT).show();
AlarmManager alarmManager = (AlarmManager) mContext.getSystemService(Context.ALARM_SERVICE);
alarmManager.cancel(deleteIntent);
deleteIntent.cancel();
}
}
"delete alarm active" Toast 出现,alarmId 是正确的。但是 Toast "alarm deleted" 没有显示,警报仍然响起。 PendingIntent 不一样吗?
谢谢
在您的 AddListActivity
中,声明类型为 Context
的私有静态成员:
private static Context mContext;
在AddListActivity
的onCreate()
方法中,初始化:
mContext = this;
在构建PendingIntent
和取消闹钟的代码块中,将AddListActivity.this
替换为mContext
。
我解决了。 显然 PendingIntent 需要相同的标志,所以当我在 deleteAlarm 方法中将其更改为 PendingIntent.FLAG_ONE_SHOT 时,它起作用了。 感谢您的帮助。