Android, Как отменить будильник? AlarmManager.cancel не работает

У меня есть приложение, в котором вы можете создать 5 аварийных сигналов, которые должны быть созданы, отображаться в ListView, и предположить, что когда элемент listView воспроизводит сигнал тревоги, но должен удалить элемент из списка, но будильник будет удален, чтобы достичь запланированного времени всегда звуки. Я просмотрел много учебных пособий и руководств по удалению тревог, но ни один из них не помог мне. Чтобы удалить то, что я делаю, это сохранить идентификатор каждого будильника в базе данных sqlite, и когда я выдаю аварийный сигнал, что я делаю, я привожу идентификатор тревоги, который нужно устранить, и передайте его в PendingIntent.getBroadcast, чтобы удалить будильник. Хочу, но этого не происходит. Кто-то может проверить мой код и сказать мне, если какая-либо ошибка попадет в такую, чтобы сигнал тревоги не был устранен. Спасибо

Этот метод, который я использую для создания аварийных сигналов

public void agregarAlarma(Calendar targetCal){ final int _id = ((int)System.currentTimeMillis()/1000); Random generator = new Random(); DbHelper helper = new DbHelper(this); SQLiteDatabase bd = helper.getWritableDatabase(); int id_nuevo = (_id + generator.nextInt()); if(alarma.getSelectedItem().toString().equals("Desayuno")){ comida = alarma.getSelectedItem().toString() + " " + targetCal.getTime().toString(); descripcion = "del desayuno"; }else if(alarma.getSelectedItem().toString().equals("Primera Merienda")){ comida = alarma.getSelectedItem().toString() + " " + targetCal.getTime().toString(); descripcion = "de la primera merienda"; }else if(alarma.getSelectedItem().toString().equals("Almuerzo")){ comida = alarma.getSelectedItem().toString() + " " + targetCal.getTime().toString(); descripcion = "del almuerzo"; }else if(alarma.getSelectedItem().toString().equals("Segunda Merienda")){ comida = alarma.getSelectedItem().toString() + " " + targetCal.getTime().toString(); descripcion = "de la segunda merienda"; } else if(alarma.getSelectedItem().toString().equals("Cena")){ comida = alarma.getSelectedItem().toString() + " " + targetCal.getTime().toString(); descripcion = "de la cena"; } Intent intent; PendingIntent pendingIntent; AlarmManager alarmManager; if(tablaVacia()>= 5){ Toast.makeText(this,"Esta lista solo permite 5 alarmas, elimine alguna para crear otra nueva",Toast.LENGTH_SHORT).show(); }else{ intent = new Intent(Recordatorios2.this, AlarmReceiver.class); intent.putExtra("Comida",comida); pendingIntent = PendingIntent.getBroadcast(Recordatorios2.this, id_nuevo ,intent, PendingIntent.FLAG_ONE_SHOT); alarmManager = (AlarmManager)getSystemService(ALARM_SERVICE); alarmManager.set(AlarmManager.RTC_WAKEUP, targetCal.getTimeInMillis(), pendingIntent); descripcionTotal = "Alarma " + descripcion + " creada "+ targetCal.getTime().toString(); Toast.makeText(this,descripcionTotal,Toast.LENGTH_SHORT).show(); ContentValues valores = new ContentValues(); valores.put("Descripcion",comida); valores.put("Identificador",id_nuevo); bd.insert("Alarmas",null,valores); llenarListaAlarmas1(); } } 

Это заполнило listView

  public void llenarListaAlarmas1(){ listaAlarmas = (ListView)findViewById(R.id.listAlarma); lista.clear(); DbHelper helper = new DbHelper(this); SQLiteDatabase bd = helper.getWritableDatabase(); Cursor c = bd.rawQuery(CONSULTA_ALARMAS,null); if(c.moveToFirst()){ do{ alarmaDatos = new AlarmaDatos(c.getString(0),null); lista.add(alarmaDatos); }while (c.moveToNext()); } final ArrayAdapter<AlarmaDatos> adapter1 = new ArrayAdapter<AlarmaDatos>(getApplicationContext(),android.R.layout.simple_list_item_1,lista); adapter1.notifyDataSetChanged(); listaAlarmas.setAdapter(adapter1); adapter1.notifyDataSetChanged(); listaAlarmas.setOnItemClickListener(new AdapterView.OnItemClickListener() { @Override public void onItemClick(AdapterView adapterView, View view, int position, long id) { switch (position){ case 0: seleccion = adapter1.getItem(position).toString(); eliminarAlarma(); adapter1.notifyDataSetChanged(); lista.remove(position); break; case 1: seleccion = adapter1.getItem(position).toString(); eliminarAlarma(); adapter1.notifyDataSetChanged(); lista.remove(position); break; case 2: seleccion = adapter1.getItem(position).toString(); eliminarAlarma(); adapter1.notifyDataSetChanged(); lista.remove(position); break; case 3: seleccion = adapter1.getItem(position).toString(); eliminarAlarma(); adapter1.notifyDataSetChanged(); lista.remove(position); break; case 4: seleccion = adapter1.getItem(position).toString(); eliminarAlarma(); adapter1.notifyDataSetChanged(); lista.remove(position); break; } } }); } 

И ЭТО ОДИН ЭТО ИСПОЛЬЗОВАНИЕ ЛИКВИДАЦИИ ТРЕВОГИ

  public void eliminarAlarma(){ DbHelper helper = new DbHelper(getApplicationContext()); SQLiteDatabase bd = helper.getWritableDatabase(); int identificador =0; String CONSULTA_ID = "SELECT Identificador FROM Alarmas WHERE Alarmas.Descripcion = '" + seleccion + "';" ; Cursor cursor = bd.rawQuery(CONSULTA_ID,null); if(cursor.moveToFirst()){ do{ alarmaDatos = new AlarmaDatos(cursor.getString(0),null); identificador = Integer.parseInt(alarmaDatos.toString()); }while (cursor.moveToNext()); } Intent intent = new Intent(getBaseContext(), AlarmReceiver.class); PendingIntent pendingIntent = PendingIntent.getBroadcast(getApplicationContext(), identificador ,intent,0); AlarmManager alarmManager = (AlarmManager)getSystemService(getApplicationContext().ALARM_SERVICE); alarmManager.cancel(pendingIntent); pendingIntent.cancel(); borrar(identificador); Toast.makeText(getApplicationContext(),"Alarma eliminada",Toast.LENGTH_SHORT).show(); } 

Может кто-то, пожалуйста, протяните мне руку, потому что правда не в том, что она устраняет тревогу, если все выглядит хорошо.

ТКС

Не нужно вызывать pendingIntent.cancel(); , Так что вытащите эту линию.

Кроме того, PendingIntent должен быть сконструирован точно так же, как это было при планировании AlarmManager.

Из документации два Соглашения считаются равными, если:

Их действие, данные, тип, класс и категории одинаковы. Это не сравнивает лишние данные, включенные в намерения.

Так было бы примерно так:

  Intent intent = new Intent(getBaseContext(), AlarmReceiver.class); PendingIntent pendingIntent = PendingIntent.getBroadcast(getApplicationContext(), identificador , intent, PendingIntent.FLAG_NO_CREATE); AlarmManager alarmManager = (AlarmManager)getSystemService(getApplicationContext().ALARM_SERVICE); alarmManager.cancel(pendingIntent); 

Для получения дополнительной информации см. Здесь:

Как отменить будильник

Создайте

 preference_saved_value = DatabaseConstants.NOTIFICATION_ID sender = PendingIntent.getBroadcast(this,preference_saved_value, intent, PendingIntent.FLAG_UPDATE_CURRENT) 

ОТМЕНА

 sender = PendingIntent.getBroadcast(this, preference_saved_value, intent,PendingIntent.FLAG_UPDATE_CURRENT); sender.cancel()