【问题标题】:Deleting a pending intent删除待处理的意图
【发布时间】:2013-08-25 16:23:28
【问题描述】:

我正在尝试从警报管理器中删除一个警报,该警报管理器正在使用挂起的意图进行广播,并且广播接收器用于捕获并执行该过程,正在调用 deleteReminder 函数,但意图仍在触发在时机成熟时。 如果代码有问题,请告诉我。

public class ReminderManager {

private Context mContext;
private AlarmManager mAlarmManager;
private Intent i;

public ReminderManager(Context context) {
    mContext = context;
    mAlarmManager = (AlarmManager) context
            .getSystemService(Context.ALARM_SERVICE);
}
public void setReminder(Long taskId, Calendar when) {

    System.out.println("setReminder Called");

    i = new Intent(mContext, Receiver.class);
    i.putExtra(Database.KEY_ROWID, (long) taskId);

    Toast.makeText(mContext, "setReminder" + Fragment.uniqueId,
            Toast.LENGTH_SHORT).show();
    PendingIntent pi = PendingIntent.getBroadcast(mContext,
            Fragment.uniqueId, i, PendingIntent.FLAG_ONE_SHOT);

    mAlarmManager.set(AlarmManager.RTC_WAKEUP, when.getTimeInMillis(), pi);
}

public void deleteReminder(int uniqueID) {

    System.out.println("deleteReminder Called");
    i = new Intent(mContext, Receiver.class);
    i.putExtra(Database.KEY_ROWID, (long) uniqueID);

    Toast.makeText(mContext, "deleteReminder" + uniqueID,
            Toast.LENGTH_SHORT).show();

    PendingIntent.getBroadcast(mContext, uniqueID, i,
            PendingIntent.FLAG_UPDATE_CURRENT).cancel();
            mAlarmManager.cancel(PendingIntent.getBroadcast(mContext, uniqueID, i,
            PendingIntent.FLAG_UPDATE_CURRENT));
}
}

【问题讨论】:

  • Fragment.uniqueId 和 param uniqueId 一样吗?
  • 它们具有相同的值,只是来自不同的地方

标签: android android-intent broadcastreceiver android-pendingintent


【解决方案1】:

此代码对我有用。

public void deleteReminder(int uniqueID) {

    System.out.println("deleteReminder Called");
    i = new Intent(mContext, Receiver.class);
    i.putExtra(Database.KEY_ROWID, (long) uniqueID);

    Toast.makeText(mContext, "deleteReminder" + uniqueID,
            Toast.LENGTH_SHORT).show();

    PendingIntent pi = PendingIntent.getBroadcast(mContext,
            Fragment.uniqueId, i, PendingIntent.FLAG_CANCEL_CURRENT);

    mAlarmManager.cancel(pi);

}

【讨论】:

  • 我试过了,但仍然会弹出警报屏幕,intent i 也被解雇了.. :(
【解决方案2】:

我在 setReminder 函数中添加了一个布尔值来检查我是否要删除,并在警报管理器中添加或删除警报的 if 语句,它减少了代码的大小并且可以正常工作。

public class ReminderManager {

private Context mContext;
private AlarmManager mAlarmManager;
private Intent i;

// Constructor to set the context and set the alarmManager
public ReminderManager(Context context) {
    mContext = context;
    mAlarmManager = (AlarmManager) context
            .getSystemService(Context.ALARM_SERVICE);
}

// used to create a pending intent using task id and Calendar object
public void setReminder(Long taskId, Calendar when, boolean delete) {

    System.out.println("setReminder Called");

    i = new Intent(mContext, OnAlarmReceiver.class);
    i.putExtra(NotesDatabase.KEY_ROWID, (long) taskId);

    Toast.makeText(mContext, "setReminder" + AddFragment.uniqueId,
            Toast.LENGTH_SHORT).show();
    // broadcast !! // change the
    PendingIntent pi = PendingIntent.getBroadcast(mContext,
            AddFragment.uniqueId, i, PendingIntent.FLAG_ONE_SHOT);

    if(delete == false){
    mAlarmManager.set(AlarmManager.RTC_WAKEUP, when.getTimeInMillis(), pi);
    }else{
        pi.cancel();
        mAlarmManager.cancel(pi);
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-28
    • 1970-01-01
    • 2019-12-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多