Alarma pendiente La alarma no se cancela

He leído muchas preguntas y respuestas sobre Stackoverflow, y muchas de ellas sólo hacen hincapié en el .cancel() y el ID especial especial. Sin embargo, ahora importa cuántas veces lo intenté, simplemente no puedo cancelarlo.


Mi identificación única

final static int RQS_1 = 1337;


Mi función setAlarm. PickTime es Activity y timesUp es otra clase de Service que muestra un brindis cuando el tiempo ha terminado.

 Intent intent = new Intent(pickTime.this, timesUp.class); PendingIntent timesUpIntent = PendingIntent.getService(pickTime.this, RQS_1, intent, 0); AlarmManager alarmManager = (AlarmManager) getSystemService(Context.ALARM_SERVICE); alarmManager.set(AlarmManager.RTC_WAKEUP, targetCal.getTimeInMillis(), timesUpIntent); alarmManager.set(AlarmManager.RTC_WAKEUP, targetCal.getTimeInMillis(), timesUpIntent); 

Mi función cancelAlarm

 Intent intent = new Intent(this, pickTime.class); PendingIntent timesUpIntent = PendingIntent.getBroadcast(this, RQS_1, intent, 0); AlarmManager alarmManager = (AlarmManager) getSystemService(Context.ALARM_SERVICE); if (timesUpIntent != null) { alarmManager.cancel(timesUpIntent); timesUpIntent.cancel(); Toast.makeText(getApplicationContext(), "Alarm is cancelled", Toast.LENGTH_SHORT).show(); } else { Toast.makeText(getApplicationContext(), "Unable to stop timer", Toast.LENGTH_SHORT).show(); } 

Mi servicio de timesUp

 public class timesUp extends Service { @Override public void onCreate() { // TODO Auto-generated method stub Toast.makeText(this, "MyAlarmService.onCreate()", Toast.LENGTH_LONG) .show(); } @Override public IBinder onBind(Intent intent) { // TODO Auto-generated method stub Toast.makeText(this, "MyAlarmService.onBind()", Toast.LENGTH_LONG) .show(); return null; } @Override public void onDestroy() { // TODO Auto-generated method stub super.onDestroy(); Toast.makeText(this, "MyAlarmService.onDestroy()", Toast.LENGTH_LONG) .show(); } @Override public void onStart(Intent intent, int startId) { // TODO Auto-generated method stub super.onStart(intent, startId); Toast.makeText(this, "MyAlarmService.onStart()", Toast.LENGTH_LONG) .show(); } @Override public boolean onUnbind(Intent intent) { // TODO Auto-generated method stub Toast.makeText(this, "MyAlarmService.onUnbind()", Toast.LENGTH_LONG) .show(); return super.onUnbind(intent); } } 

Bueno para cancelar la alarma que tiene que crear el mismo PendingIntent que se creó al iniciarlo. Usted está haciendo al comenzar,

 Intent intent = new Intent(pickTime.this, timesUp.class); PendingIntent timesUpIntent = PendingIntent .getService(pickTime.this, RQS_1, intent, 0); 

Usted está haciendo durante la cancelación,

 Intent intent = new Intent(this, pickTime.class); PendingIntent timesUpIntent = PendingIntent .getBroadcast(this, RQS_1, intent, 0); 

¿Son iguales?

No, no son iguales. Está creando PendingIntent para que Service inicie y intente cancelar con diferentes PendingIntent de BroadCast .

Sospecho que hay algo mal con el último (4to) argumento del método PendingIntent.getService(pickTime.this, RQS_1, intent, 0); En su código.

Intente usar PendingIntent.FLAG_CANCEL_CURRENT lugar de 0, debería funcionar.

No estoy seguro de si este es el único problema pero

 @Override public void onStart(Intent intent, int startId) { // TODO Auto-generated method stub super.onStart(intent, startId); Toast.makeText(this, "MyAlarmService.onStart()", Toast.LENGTH_LONG) .show(); }**strong text** 

El onStart está obsoleto. Para un servicio use onStartCommand ().

Consulte el ejemplo en los documentos del desarrollador:

Servicios de Android

Yo uso algo así en mi aplicación de control de audio y funciona bien.

 Intent intent = new Intent(getApplicationContext(), QuickReceiver.class); intent.putExtra("extraKeyHere", "some extra if you like"); PendingIntent pi = PendingIntent.getBroadcast(getApplicationContext(), 1137, intent, PendingIntent.FLAG_CANCEL_CURRENT); AlarmManager al = (AlarmManager)getApplicationContext().getSystemService(Context.ALARM_SERVICE); al.setRepeating(AlarmManager.RTC_WAKEUP, endCal.getTimeInMillis(), AlarmManager.INTERVAL_DAY, pi); 

Esto es sólo crear una intención que activará un receptor de difusión (QuickReceiver.class).

 public class QuickReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { Bundle extras = intent.getExtras(); if(extras != null) { String endProfile = extras.getString("extraKeyHere"); Intent i = new Intent(context, QuickReceiver.class); PendingIntent pi = PendingIntent.getBroadcast(context, 1137, i, PendingIntent.FLAG_CANCEL_CURRENT); AlarmManager al = (AlarmManager)context.getSystemService(Context.ALARM_SERVICE); al.cancel(pi); } } } 

Tome nota de que usé "getBroadcast ()" para ambos pendingIntents. Usted podría comenzar su servicio de la difusión (usando onStartCommand () por supuesto :)) y hacer más trabajo allí.

  • ¿Cómo compara Android las intenciones pendientes?
  • ¿Cómo cancelar la tarea de repetición en el Administrador de alarmas?
  • La notificación abre actividad, se pulsa el botón de retroceso, se abre la actividad principal?
  • ¿Cómo usar "goAsync" para broadcastReceiver?
  • Lectura de un mensaje NDEF desde una etiqueta NFC desde una aplicación de Android
  • Extras de Android PendingIntent, no recibidos por BroadcastReceiver
  • Pasando intención extra a receptor de radiodifusión android
  • Widget no actualizado en el reinicio del lanzador
  • Buscando explicación de los laicos sobre el concepto de intención pendiente
  • Transmisión global o transmisión local con PendingIntent
  • No se puede establecer la alarma de repetición en el tiempo de arranque
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.