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
- ¿Cómo enviar una emisión ordenada en un PendingIntent?
- Programar más de una actividad pendiente en la misma actividad con AlarmManager
- Android - ¿Qué es un PendingIntent?
- Adición de indicadores a PendingIntent
- Notificación de Android PendienteIntentos adicionales null
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); } }
- Múltiples notificaciones para la misma actividad
- Cómo guardar persistentemente PendingIntent proporcionado por otra aplicación
- RecognizerIntent: cómo agregar un paquete a una intención pendiente
- OnClick PendingIntent en widget a veces no funciona
- Dos botones con PendingIntents - Widget
- La Notificación de Android reinicia la aplicación pero desea continuar
- Android Geofencing - No intentos próximos?
- Android O, Background Service se está ejecutando durante más de 30 minutos. ¿Por qué?
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 crear un botón de Twitter en Android?
- Cómo configurar el volumen de llamada entrante mediante programación en android?