取消Android中的警报管理器

时间:2014-09-27 08:50:42

标签: java android alarmmanager

尝试在Android中取消AlarmManager时出现问题。我正在调用这个retrieveBudget()onCreate:

public void retrieveBudget() {
    txtDisplayMonthlyExpenses = (TextView) findViewById(R.id.txtDisplayMonthlyExpense);
    txtDisplayBudget = (TextView) findViewById(R.id.txtDisplayBudget);
    cbDisplayReminderNotify = (CheckBox) findViewById(R.id.cbDisplayReminderNotify);
    cbDisplayReminderNotify.setEnabled(false);

    DatabaseAdapter mDbHelper = new DatabaseAdapter(this);
    mDbHelper.createDatabase();
    mDbHelper.open();
    TransactionRecController trc = new TransactionRecController(
            mDbHelper.open());
    currentMonthExpense = trc.getThisMonthDebit();
    txtDisplayMonthlyExpenses.setText("$ "
            + formatter.format(currentMonthExpense));

    BudgetController bc = new BudgetController(mDbHelper.open());

    BudgetModel bm = bc.getBudget();
    if (bm.getBudgetAmount() != 0 && bm.getReminderNotify() != null) {
        budget = bm.getBudgetAmount();
        txtDisplayBudget.setText("$ " + formatter.format(budget));
        if (bm.getReminderNotify().equals("Y")) {
            cbDisplayReminderNotify.setChecked(true);
        } else {
            cbDisplayReminderNotify.setChecked(false);
        }
        AlarmManager mgr = (AlarmManager) context
                .getSystemService(Context.ALARM_SERVICE);
        PendingIntent pi = null;
        if (bm.getReminderNotify().equals("Y")
                && currentMonthExpense > budget) {
            Calendar calendar = Calendar.getInstance();
            calendar.setTimeInMillis(System.currentTimeMillis());
            calendar.set(Calendar.HOUR_OF_DAY, 0);
            calendar.set(Calendar.MINUTE, 1);
            notificationCount = notificationCount + 1;

            Intent notificationIntent = new Intent(context,
                    BudgetAlarm.class);
            notificationIntent.putExtra("NotifyCount", notificationCount);
            pi = PendingIntent.getBroadcast(context, notificationCount,
                    notificationIntent, PendingIntent.FLAG_UPDATE_CURRENT);
            mgr.setInexactRepeating(AlarmManager.RTC_WAKEUP,
                    calendar.getTimeInMillis(), 60000, pi);
        } else {
            mgr.cancel(pi);
        }
    } else {
        txtDisplayBudget.setText("No budget record yet");
    }

    mDbHelper.close();
}

在我的budgetAlarm类中,它只是设置通知。所以我的问题是它每分钟都执行通知。但在我将reminderNotify更改为“N”而不是“Y”后,它不会取消警报管理器。我想知道为什么会这样,因为在我更新SQL语句之后,我再次调用了这个retrieveBudget()。

提前致谢。

修改

这些是我更新预算部分的代码。当点击Okay from dialog框时,我再次调用retrieveBudget()。

public void onEditBudgetClicked(View view) {
    AlertDialog.Builder EditDialog = new AlertDialog.Builder(this);
    EditDialog.setTitle("Edit Budget");

    // Get the components from XML file
    LayoutInflater li = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    View dialogView = li.inflate(R.layout.edit_budget, null);
    txtEditBudgetAmount = (EditText) dialogView
            .findViewById(R.id.txtEditBudgetAmount);
    cbEditReminderNotify = (CheckBox) dialogView
            .findViewById(R.id.cbEditReminderNotify);

    // Retrieve budget record
    DatabaseAdapter mDbHelper = new DatabaseAdapter(this);
    mDbHelper.createDatabase();
    mDbHelper.open();
    BudgetController bc = new BudgetController(mDbHelper.open());
    BudgetModel bm = bc.getBudget();
    if (bm.getBudgetAmount() != 0 && bm.getReminderNotify() != null) {
        txtEditBudgetAmount.setText(Float.toString(bm.getBudgetAmount()));
        if (bm.getReminderNotify().equals("Y")) {
            cbEditReminderNotify.setChecked(true);
            editReminderNotify = "Y";
        } else {
            cbEditReminderNotify.setChecked(false);
        }
    }
    mDbHelper.close();

    cbEditReminderNotify.setOnClickListener(new OnClickListener() {
        @Override
        public void onClick(View v) {
            if (cbEditReminderNotify.isChecked()) {
                editReminderNotify = "Y";
            } else {
                editReminderNotify = "N";
            }
        }
    });

    EditDialog.setView(dialogView);
    EditDialog.setPositiveButton("Ok",
            new DialogInterface.OnClickListener() {
                public void onClick(DialogInterface dialog, int whichButton) {
                    onEditBudgetSubmitClicked();
                    dialog.dismiss();
                    retrieveBudget();
                }
            });

    EditDialog.setNegativeButton("Cancel",
            new DialogInterface.OnClickListener() {
                public void onClick(DialogInterface dialog, int whichButton) {
                    dialog.dismiss();
                }
            });
    EditDialog.show();
}

2 个答案:

答案 0 :(得分:1)

在创建和取消警报管理器时初始化待处理意图时使用的通知计数值应该相同。

在待处理的意图中使用requestFalg的相同值。

替换此部分:

AlarmManager mgr = (AlarmManager) context
            .getSystemService(Context.ALARM_SERVICE);
PendingIntent pi = null;
if (bm.getReminderNotify().equals("Y")
           && currentMonthExpense > budget) {
    Calendar calendar = Calendar.getInstance();
    calendar.setTimeInMillis(System.currentTimeMillis());
    calendar.set(Calendar.HOUR_OF_DAY, 0);
    calendar.set(Calendar.MINUTE, 1);
    notificationCount = notificationCount + 1;
    Intent notificationIntent = new Intent(context,
                BudgetAlarm.class);
    notificationIntent.putExtra("NotifyCount", notificationCount);
    pi = PendingIntent.getBroadcast(context, notificationCount,
                notificationIntent, PendingIntent.FLAG_UPDATE_CURRENT);
    mgr.setInexactRepeating(AlarmManager.RTC_WAKEUP,
                calendar.getTimeInMillis(), 60000, pi);
    } else {
        mgr.cancel(pi);
    }

AlarmManager mgr = (AlarmManager) context
            .getSystemService(Context.ALARM_SERVICE);
Intent notificationIntent = new Intent(context,
                BudgetAlarm.class);
PendingIntent pi = null;
if (bm.getReminderNotify().equals("Y")
            && currentMonthExpense > budget) {
    Calendar calendar = Calendar.getInstance();
    calendar.setTimeInMillis(System.currentTimeMillis());
    calendar.set(Calendar.HOUR_OF_DAY, 0);
    calendar.set(Calendar.MINUTE, 1);
    notificationCount = notificationCount + 1;
    notificationIntent.putExtra("NotifyCount", notificationCount);
    pi= PendingIntent.getBroadcast(context, 1,
                notificationIntent, PendingIntent.FLAG_UPDATE_CURRENT);
    mgr.setInexactRepeating(AlarmManager.RTC_WAKEUP,
                calendar.getTimeInMillis(), 60000, pi);
    } else {
        pi= PendingIntent.getBroadcast(context, 1,
                notificationIntent, PendingIntent.FLAG_UPDATE_CURRENT);
        mgr.cancel(pi);
    }

如果您在启动闹钟后初始化待处理的意图时更改了requestFlag的值(在您的情况下为notificationcount),则您将无法取消它。

在创建和取消警报时,在待处理的意图中使用requestFlag的相同值。在这里,我使用的是。

由于您在启动警报管理器后更改了notificationFlag的值,因此请勿将notificationFlag用作requestFlag。使用常量整数值作为requestFlag,同时在if和else部分中初始化 pi

pi = PendingIntent.getBroadcast(context,CONSTANT_INTEGER,notificationIntent,PendingIntent.FLAG_UPDATE_CURRENT);

检查以下链接:

PendingIntent getBroadcast(Context context,int requestCode,Intent intent,int flags)

http://developer.android.com/reference/android/app/PendingIntent.html#getBroadcast%28android.content.Context,%20int,%20android.content.Intent,%20int%29

答案 1 :(得分:0)

    AlarmManager mgr = (AlarmManager) context
            .getSystemService(Context.ALARM_SERVICE);
    PendingIntent pi = null;
    if (bm.getReminderNotify().equals("Y")
            && currentMonthExpense > budget) {
        Calendar calendar = Calendar.getInstance();
        calendar.setTimeInMillis(System.currentTimeMillis());
        calendar.set(Calendar.HOUR_OF_DAY, 0);
        calendar.set(Calendar.MINUTE, 1);
        notificationCount = notificationCount + 1;

        Intent notificationIntent = new Intent(context,
                BudgetAlarm.class);
        notificationIntent.putExtra("NotifyCount", notificationCount);
        pi = PendingIntent.getBroadcast(context, notificationCount,
                notificationIntent, PendingIntent.FLAG_UPDATE_CURRENT);
        mgr.setInexactRepeating(AlarmManager.RTC_WAKEUP,
                calendar.getTimeInMillis(), 60000, pi);
    } else {
       notificationCount = notificationCount + 1;

        Intent notificationIntent = new Intent(context,
                BudgetAlarm.class);
        notificationIntent.putExtra("NotifyCount", notificationCount);
        pi = PendingIntent.getBroadcast(context, notificationCount,
                notificationIntent, PendingIntent.FLAG_UPDATE_CURRENT);
        mgr.cancel(pi);
    }