web-dev-qa-db-fra.com

Comment annuler cette alarme répétitive?

J'écris quelque chose comme un rappel pour les utilisateurs. Les utilisateurs définiront des rappels pour leurs événements, le moment venu, une alarme répétitive sera définie pour déclencher une notification de barre d'état. Mais l'alarme semble ininterrompue après avoir sélectionné la notification ou effacé la notification. Je ne sais pas où annuler cette alarme répétée. Voici quelques codes: Configurer l'alarme répétitive dans mon activité principale

alarmTime = Calendar.getInstance();
Intent intent = new Intent(this, AlarmReceive.class);
PendingIntent sender = PendingIntent.getBroadcast(this, 0, intent, 0);
AlarmManager alarmManager = (AlarmManager) getSystemService(ALARM_SERVICE);

alarmTime.add(Calendar.MINUTE,offset_time);

//Schedule the alarm
alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, alarmTime.getTimeInMillis(), 30 * 1000, sender);

Dans ma méthode OnReceive, j'affiche simplement la notification dans la barre d'état et définit l'indicateur comme FLAG_AUTO_CANCEL

manager = (NotificationManager) context.getSystemService(context.NOTIFICATION_SERVICE);

// Set the icon, scrolling text and timestamp
Notification notification = new Notification(R.drawable.medical, text, System.currentTimeMillis());

PendingIntent contentIntent = PendingIntent.getActivity(context, 0, i, 0);

notification.flags = Notification.FLAG_AUTO_CANCEL;

manager.notify(R.string.service_text, notification);

Comment puis-je arrêter l'alarme lorsque l'utilisateur sélectionne la notification ou l'efface?

34
Wen

Appelez cancel() sur AlarmManager avec un PendingIntent équivalent à celui que vous avez utilisé avec setRepeating():

Intent intent = new Intent(this, AlarmReceive.class);
PendingIntent sender = PendingIntent.getBroadcast(this, 0, intent, 0);
AlarmManager alarmManager = (AlarmManager) getSystemService(ALARM_SERVICE);

alarmManager.cancel(sender);
79
CommonsWare

J'ai essayé différentes méthodes et je ne pouvais pas le faire fonctionner, alors j'ai décidé de faire un sale tour. Lorsque je veux annuler mon alarme répétée, j'utilise la même méthode qui a créé mon alarme (et donc remplacer l'ancienne), puis l'annule immédiatement. Avec cette méthode, si la variable booléenne est définie sur true, elle crée une alarme maintenant qu'elle remplace, puis annule le remplacement qui a le même identifiant:

static void CancelRepeatingAlarm(Context context, boolean creating){
    //if it already exists, then replace it with this one
    Intent alertIntent = new Intent(context, AlertReceiver.class);
    PendingIntent timerAlarmIntent = PendingIntent
            .getBroadcast(context, 100, alertIntent,PendingIntent.FLAG_CANCEL_CURRENT); 
    AlarmManager alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
    if (creating){
        alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), INTERVAL, timerAlarmIntent);
    }else{
        alarmManager.cancel(timerAlarmIntent);
    }
4
Ramin Fallahzadeh

Dans votre MainActivity, définissez l'heure de l'alarme. Si vous prévoyez d'utiliser plusieurs alarmes, utilisez SharedPreferences pour stocker leurs ID respectifs. Voici le code:

PendingIntent pendingIntent = PendingIntent.getBroadcast(MainActivity.this, _id,intent, PendingIntent.FLAG_UPDATE_CURRENT);
alarmManager = (AlarmManager) getSystemService(Activity.ALARM_SERVICE);
alarmManager.set(AlarmManager.RTC_WAKEUP, targetCal.getTimeInMillis(),
            pendingIntent);

public static Context getContext() {
    return mContext;
}
mContext=mainactivity.this;

Dans votre deuxième Activity utilisez le même identifiant de SharedPreferences. Dans mon code, j'obtiens l'ID de la ArrayList, Alarm_id. Enfin, vous pouvez utiliser le contexte MainActivity ici avec MainActivity.getContext(). Voici le code:

AlarmManager alarmManager = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
Intent intentAlarm = new Intent(AlarmListviewActivity.this,
        MainActivity.class);
PendingIntent morningIntent = PendingIntent.getBroadcast(MainActivity.getContext(), Alarm_id.get(positon),
        intentAlarm, PendingIntent.FLAG_CANCEL_CURRENT);

alarmManager.cancel(morningIntent);
morningIntent.cancel();
3
Sunil Chaudhary