2014-09-27 2 views
1

У меня возникли проблемы при попытке отменить AlarmManager в Android. Я называю это retrieveBudget() OnCreate:Отмена Alarm Manager в Android

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, это просто установка уведомления. Поэтому моя проблема заключается в том, что она выполняла уведомление каждую минуту. Но после того, как я изменил свое напоминаниеNotify на «N» вместо «Y», он не отменяет диспетчер аварийных сигналов. Интересно, почему это так, потому что после моего оператора SQL обновления я снова вызываю это retrieveBudget().

Заранее спасибо.

EDIT

Эти коды, где я обновляю бюджет часть. Я снова вызываю 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(); 
} 
+0

Ваш пи инициализируется нулем, а также, если вы хотите чтобы отменить, вы должны воссоздать свое ожидающее намерения, а затем отправить его с помощью отмены на AlarmManager – Pavlos

+0

Хорошо, поэтому я просто скопировал четыре строки кода? –

+0

Да, убедитесь, что он будет таким же, как тот, который вы отправили! – Pavlos

ответ

2

Значение счетчика уведомлений используются при инициализации ожидающего намерения в создании времени и отмене управляющего сигналом тревоги должна быть одинаковыми.

Используйте ту же самую ценность 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.

Поскольку вы меняете значение уведомленияFlag после запуска диспетчера аварийных сообщений, не используйте notificationFlag как requestFlag. Используйте константное целочисленное значение как requestFlag при инициализации pi внутри обеих частей if и else.

pi = PendingIntent.getBroadcast (контекст, CONSTANT_INTEGER, notificationIntent, PendingIntent.FLAG_UPDATE_CURRENT);

проверить ссылку ниже:

PendingIntent getBroadcast (контекст Контекст, внутр requestCode, Намерение Намерение, Int флаги)

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

+0

. Значит, вы должны сказать это после объявления PendingIntent и перед оператором if? –

+0

Не могли бы вы рассказать немного больше? Я все еще смущен –

+0

Хорошо, спасибо большое! Итак, для моего случая я должен заменить ваш 1 на notificationCount? Кроме того, почему вы используете 1? Извините, я был abit confused –

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

Извините, но что мне с этим делать? –

+0

Просто замените его в своем старом коде, где вы настраивали диспетчер аварийных сообщений – Pavlos

+0

Нет, он не работает. Диспетчер аварийных сигналов все еще выполняет. Вы знаете, почему? –