【问题标题】:Deleting an alarm with alarmManager.cancel after alertdialog在 alertdialog 之后使用 alarmManager.cancel 删除警报
【发布时间】:2016-02-03 17:09:51
【问题描述】:

我在列表项中有一个按钮来删除该项。当有与该项目相关联的警报时,我也想删除该警报。 要删除该项目,我会显示一个警告对话框,在肯定按钮中使用删除功能:

builder.setPositiveButton("DELETE", new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialog, int which) {

                    DeleteList del = new DeleteList();
                    del.execute(listId);
                }
            });

但我也需要删除警报,问题是警报设置在另一个活动中。我有 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 不是封闭类”。

我该如何解决这个问题?如何取消闹钟?我是否发送了一些带有 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();
    }
}

“删除警报活动”Toast 出现,alarmId 是正确的。但是 Toast “警报已删除”没有显示,警报仍然响起。 PendingIntent 不一样吗?

谢谢

【问题讨论】:

    标签: android alarmmanager android-alarms


    【解决方案1】:

    在您的AddListActivity 中,声明Context 类型的私有静态成员:

    private static Context mContext;
    

    AddListActivityonCreate()方法中,对其进行初始化:

    mContext = this;
    

    在构建PendingIntent并取消警报的代码块中,将AddListActivity.this替换为mContext

    【讨论】:

    • 谢谢,这使得 AddListActivity 中的方法静态化成为可能。但它仍然没有删除警报。我将在问题的编辑中发布代码。
    【解决方案2】:

    我解决了。 显然 PendingIntent 需要相同的标志,所以当我在 deleteAlarm 方法中将它更改为 PendingIntent.FLAG_ONE_SHOT 时,它起作用了。 感谢您的帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-01-07
      • 1970-01-01
      • 1970-01-01
      • 2017-09-16
      • 2013-05-12
      相关资源
      最近更新 更多