无法取消闹钟管理员

时间:2018-02-12 11:11:14

标签: java android alarmmanager android-pendingintent

在从日期选择器和时间戳选择所需的日期和时间后,我尝试创建3个通知。我想为所选值发送最近3天的通知。但在3次通知后,我想取消通知流程。我从我的活动中设置了待处理通知和警报管理器,如

TimePickerDialog.OnTimeSetListener mTimeSetListener = new TimePickerDialog.OnTimeSetListener() {
    public void onTimeSet(TimePicker view, int hourOfDay, int minute) {
        //last 3 days add notification
        Calendar calendar =  Calendar.getInstance();
        calendar.set(year, month, day, hourOfDay, minute, 0);
        long when = calendar.getTimeInMillis();
        when = when -3*(24*60*60*1000)+3000; //set startup time 3 days before
        GetTime(when);
        long diff = when - Calendar.getInstance().getTimeInMillis();
        while (diff < 0){
            when+= (24*60*60*1000); //increment 24h if selected time is closer then 3 days
            diff = when - Calendar.getInstance().getTimeInMillis();
            GetTime(when);
        }

        if (diff >0) {
            Intent notifyIntent = new Intent(getApplicationContext() ,NotificationReceiver.class);
            notifyIntent.putExtra("ctg", categorySelected);
            PendingIntent pendingIntent = PendingIntent.getBroadcast(getApplicationContext(), new Utils().getIdForCategory(categorySelected), notifyIntent, PendingIntent.FLAG_UPDATE_CURRENT);
            AlarmManager alarmManager = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
            alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, when, 60*1000, pendingIntent); //setting for testing purposes for 60 seconds
        }
    }
};

我的接收器类是:

protected void onHandleIntent(Intent intent) {
    String categorySelected = intent.getStringExtra("ctg");
    SharedPreference pref = new SharedPreference(getApplicationContext());
    int alarmCount = pref.getAlarmCount(categorySelected);
    if (alarmCount<=3){
        Log.d("alarmCount", String.valueOf(alarmCount));
        pref.saveAlarmCount(categorySelected,alarmCount+1);
        showNotification(intent);
    }
    else //we reached the 3 times
    {
        new Utils().clearAllPendingIntent(getApplicationContext(),categorySelected);
    }
}

和我明确的方法

public void clearAllPendingIntent(Context context, String categorySelected){
    AlarmManager alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);

    Intent notifyIntent = new Intent(context ,NotificationReceiver.class);
    notifyIntent.putExtra("ctg",categorySelected);
    PendingIntent pendingUpdateIntent = PendingIntent.getBroadcast(context, new Utils().getIdForCategory(categorySelected), notifyIntent, PendingIntent.FLAG_CANCEL_CURRENT);
    SharedPreference pref = new SharedPreference(context);
    pref.saveAlarmCount(categorySelected,1);
    // Cancel alarms
    try {
        alarmManager.cancel(pendingUpdateIntent);
    } catch (Exception e) {

    }
}

我的问题是,待处理的意图在3次后没有被取消,这意味着我每分钟都会收到通知。我做错了什么?

1 个答案:

答案 0 :(得分:0)

实际问题在于我的new Utils().getIdForCategory(categorySelected)函数,该函数应根据类别返回特定值。

public int getIdForCategory(String category){
    if (category.equals("A")) return 1; //before it was category=="A"
    if (category.equals("B")) return 2;
    if (category.equals("C")) return 3;
    if (category.equals("D")) return 4;
    if (category.equals("E")) return 5;
    return 0;
}