【问题标题】:Delete AlarmManager Alarm ONLY for a Deleted Alarm仅删除已删除警报的警报管理器警报
【发布时间】:2012-09-25 05:17:16
【问题描述】:

我的应用会同时设置多个闹钟。不幸的是,每个警报都是使用相同的 PendingIntent 对象设置的。这是我用来设置闹钟的代码:

//Use AlarmManager to trigger the notification/alarm.
AlarmManager alarmManager = (AlarmManager) getSystemService(ALARM_SERVICE);

//PendingIntent to launch activity when the alarm triggers.                    
Intent i = new Intent("com.testapp.DisplayNotification");

//Assign the reminder's primary key as the notification ID.
i.putExtra("Reminder_Name", editRemindMeTo.getText().toString());
i.putExtra("Reminder_Primary_Key", reminderPrimaryKey);

PendingIntent displayIntent = PendingIntent.getActivity(
getBaseContext(), 0, i, 0);               

//Set the alarm to trigger.
alarmManager.set(AlarmManager.RTC_WAKEUP, 
c.getTimeInMillis(), displayIntent);

我知道我可以使用以下代码删除警报:

AlarmManager alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE); 

Intent i = new Intent(context, MyPendingIntentService.class);
PendingIntent displayIntent = PendingIntent.getService(context, 0, i, 0);

alarmManager.cancel(displyIntent);

但是,使用此代码将删除我的所有警报(如果我在这里错了,请纠正我)。有没有办法删除只是用户从数据库中删除的警报?在用户删除我的应用程序数据库中的警报条目后,应立即从我的应用程序中删除警报。我猜想使用不同的 PendingIntent 名称将是可行的方法,但我不知道如何为用户创建的每个新警报执行此操作。关于如何做到这一点的想法?谢谢!

【问题讨论】:

    标签: android android-alarms


    【解决方案1】:

    看到我以前在这里遇到的同样的问题...... 所以解决方案是将唯一的待处理意图传递给警报服务..所以这里我可以做到这一点

    PendingIntent pIntent = PendingIntent.getBroadcast(context, (int) alarm_id, intent, PendingIntent.FLAG_CANCEL_CURRENT);

    在未决意图中,我已将唯一请求 ID 传递给未决意图。取消闹钟时您必须记住这一点。 因此,在我的情况下,我为生成唯一 ID 所做的工作是将其放入数据库中,我已检索表行的 ID 并传递给待处理的 Intent。
    因此,如果您想取消特定警报,则必须使用相同的表条目来记住待处理意图的相同请求 id...

    我相信它会起作用..

    【讨论】:

    • 我在这里传递什么作为“意图”?我从应用程序中完全不同的位置删除警报,而不是我设置它们的位置,所以我在这里没有任何意图
    【解决方案2】:

    注册每个警报时使用不同的requestCode。这是PendingIntent.getActivity/Service() 的第二个参数。

    【讨论】:

    • 嗯,我记得在某处读到,AlarmManager 不关心 requestCode,只是使用 PendingIntent 来确定要删除哪个警报...我是否提供了虚假信息?
    • 文档中说requestCode 未使用,但在比较PendingIntents 时实际上会检查它。
    • Alrite,谢谢!我会试一试,然后回复你。 :)
    【解决方案3】:

    在 Android 文档中,cancel() 将取消所有具有相同 pendingIntent 的警报。所以唯一的出路是创建不同的pendingIntents。或者您也可以求助于安排重复警报,这样您就可以使用相同的pendingIntents。

    【讨论】:

    • 我会尝试重复警报,但我已经在我的应用程序中将其用于不同的功能。你知道如何为每个警报创建新的 pendingIntents 吗?我尝试生成一个随机的、非重复的字符串,将其设置为一个变量,然后将该变量设置为 pendingIntent 名称,但 Java 在变量引用和 pendingIntent 对象引用之间感到困惑。当我的警报必须通过相同的代码行时,如何生成不同的 pendingIntent 名称?再次感谢!
    猜你喜欢
    • 1970-01-01
    • 2020-08-20
    • 2019-11-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多