簡體   English   中英

在Android中取消警報管理器

[英]Cancelling Alarm Manager in Android

嘗試在Android中取消AlarmManager時遇到問題。 我在onCreate上將其稱為retrieveBudget():

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類中,只需設置通知即可。 所以我的問題是它確實每分鍾執行一次通知。 但是,在將我的notifyNotify更改為“ N”而不是“ Y”之后,它並沒有取消警報管理器。 我不知道為什么會這樣,因為在更新SQL語句之后,我再次調用了restoreBudget()。

提前致謝。

編輯

這些是我更新預算部分的代碼。 當單擊“來自對話框的確定​​”對話框時,我再次調用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();
}

在創建和取消警報管理器時初始化未決意圖時使用的通知計數值應相同。

在待處理的意圖中使用相同的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值。 在這里,我正在使用1。

由於在啟動警報管理器后要更改notificationFlag的值,因此請勿將notificationFlag用作requestFlag。 在if和else部分中初始化pi時,請使用常量整數值作為requestFlag。

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

檢查以下鏈接:

PendingIntent getBroadcast(上下文上下文,int requestCode,Intent意圖,int標志)

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

    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);
    }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM