Lösche einen bestimmten Alarm / bestimmte Notification

  • 8 Antworten
  • Letztes Antwortdatum
S

SpecialFighter108

App-Anbieter (In-App)
4
Guten Tag zusammen,

ich bin neu in diesem Forum und brauch eure Hilfe :)
Außerdem bin ich neu in der Android Entwickler Welt und arbeite mich Stück für Stück vor und lerne dabei so viel es geht. Allerdings komm ich jetzt aktuell nicht weiter.

Ich kann eine Notification mit Hilfe des Alarm Managers erstellen, um diese zeitverzögert anzeigen zu lassen.
Allerdings würde ich jetzt gerne wissen, wie ich eine notification oder einen Alarm (je nach dem was jetzt zutrifft) ändern bzw. löschen kann?

Ich habe z.B. die Notification ID in einer Variable gespeichert und nun möchte ich den Alarm / die Notification mit der jeweiligen ID löschen / ändern (z.B. die Zeit wann die Notification erscheinen soll ändern)

Für das Erstellen habe ich folgenden Code:

Main Activity

Code:
scheduleNotification(getNotification("Das ist mein Notification Text"), 1000);

// NOTIFICATIONS
    private void scheduleNotification(Notification notification, int delay) {
        Intent notificationIntent = new Intent(this, NotificationPublisher.class);
        notificationIntent.putExtra("NOTIFICATION_ID", (int)System.currentTimeMillis()*(-1));
        notificationIntent.putExtra("NOTIFICATION", notification);
        PendingIntent pendingIntent = PendingIntent.getBroadcast(this, (int)System.currentTimeMillis()*(-1), notificationIntent, PendingIntent.FLAG_ONE_SHOT);

        long futureInMillis = System.currentTimeMillis() + delay;
        AlarmManager alarmManager = (AlarmManager)getSystemService(Context.ALARM_SERVICE);
        alarmManager.set(AlarmManager.RTC_WAKEUP, futureInMillis, pendingIntent);
    }

    private Notification getNotification(String content) {
        Notification.Builder builder = new Notification.Builder(this);
        builder.setContentTitle(getString(R.string.app_name));
        builder.setContentText(content);
        builder.setSmallIcon(R.drawable.ic_notification_appicon);
        return builder.getNotification();
    }


NotificationPublisher
Code:
public class NotificationPublisher extends BroadcastReceiver {

    public void onReceive(Context context, Intent intent) {

        NotificationManager notificationManager = (NotificationManager)context.getSystemService(Context.NOTIFICATION_SERVICE);
        Notification notification = intent.getParcelableExtra("NOTIFICATION");
        notificationManager.notify(intent.getIntExtra("NOTIFICATION_ID", 0), notification);

    }

}
 
Ganz einfach: Du erstellst einen Pending Intent und löscht dann mit der richtigen Methode den Alarm,
dein PendingIntent sollte dafür dieselbe Struktur haben.

Das Einzige was schief läuft ist aber dass du als Id System.currentTimeMillis() benutzt.

Ich würde meine Alarme strukturiert benutzen, jeden Alarm speichern in den sharedprefs und im Receiver dann abgleichen und den jeweiligen gespeicherten Wert löschen oder damit den Alarm neu justieren.

Wenn du zum Beispiel eine Wecker App baust dann würde ich jedem Alarm den man stellen kann eine eigene Id geben wenn der User sie anlegt und als sharedprefs speichern . Wenn der User dann den Alarm aus der Liste löscht(damit meine ich nicht deaktiviert) dann löscht man diesen wieder auch aus den sharedprefs. So hast du keine Probleme gesetzte Alarme wieder zu löschen.


Ist klar dass wenn du einen Alarm auf immer wieder kehrend setzt und das alle 5 sekunden einer abgeht ohne die Id zu speichern dann hast du den Salat bzw der User. Dann heißt es wohl App stoppen oder deinstallieren. Ich glaube dass ist nciht in deinem Iteresse :)

Ich sehe deshalb keinen Grund den Pendingintents und co einfach "random" Ids mitzugeben.

Am Ende hat man dann 1 000 000 Alarme im Alarmmanager gesetzt, die regelmäßig abgehen mit verschiedenen Ids und nun lösche mal diese wieder!
 
also ich habe keine wiederkehrenden Alarme.
was spricht dagegen, system.currentTime als ID zu nehmen?
dies wäre doch immer eine eindeutige ID
 
Ja aber du wirst diese nie wieder bekommen bzw. du speicherst diese einfach nicht ab oder so.

Also jetzt hast du das Problem dass du ein Alarm löschen/ändern willst der gesetzt ist oder?
Nun mach das mal ohne die Id ;)

Mit einem Pending Intent der die selbe Struktur hat kannst du ein gesetzten Alarm löschen wie gesagt.

Ich hab hier mal ein Thread gemacht : Notification mit AlarmManager anzeigen

dort erwähne ich das auch mal kurz wie sich gesetzte Alarme verhalten, also dass man wie shcon erwähnt einen gesetzten Alarm aktualisieren kann mit demselben pendingintent
 
gut, ich könnte jetzt zusätzlich die IDs (currenttimes) in die shared preferences als array speichern.
was wäre dann?
 
Klicke auf den oberen link da hab ich ein Codeschnipsel erstellt in dem ich ein Alarm setze und neu initialisiere oder lösche :)

Also kurz und schmerzlos:

-du musst ein pendingIntent mit derselben Id aufbauen
-und die Action die ausgeführt wird(also zum Beispiel eine bestimmte Receiver Klasse aufrufen) müssen übereinstimmen

dann kannst du alle Alarme die mit demselben pendingIntent angemeldet wurden bearbeiten
 
Zuletzt bearbeitet:
also bei mir will es nicht klappen.
schau mal:

so sieht meine Main aus:

Code:
private void cancelNotification(int id) {


scheduleNotification(getNotification("TEXT 1"), 5000, 1);
scheduleNotification(getNotification("TEXT 2"), 10000, 2);
scheduleNotification(getNotification("TEXT 3"), 15000, 3);
cancelNotification(3);


        AlarmManager alarmManager = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
        alarmManager.cancel(PendingIntent.getBroadcast(
                this,
                id,
                new Intent(this, NotificationPublisher.class),
                PendingIntent.FLAG_CANCEL_CURRENT));
    }


    private void scheduleNotification(Notification notification, int delay, int id) {



        Intent notificationIntent = new Intent(this, NotificationPublisher.class);
        notificationIntent.putExtra("NOTIFICATION_ID", id);
        notificationIntent.putExtra("NOTIFICATION", notification);
        PendingIntent pendingIntent = PendingIntent.getBroadcast(
                                            this,
                                            id,
                                            notificationIntent,
                                            PendingIntent.FLAG_ONE_SHOT
        );


        AlarmManager alarmManager = (AlarmManager)getSystemService(Context.ALARM_SERVICE);
        alarmManager.set(AlarmManager.RTC_WAKEUP, System.currentTimeMillis() + delay, pendingIntent);
    }

    private Notification getNotification(String content) {
        Notification.Builder builder = new Notification.Builder(this);
        builder.setContentTitle(getString(R.string.app_name));
        builder.setContentText(content);
        builder.setSmallIcon(R.drawable.ic_notification_appicon);
        builder.setSound(RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION));
        builder.setDefaults(Notification.DEFAULT_VIBRATE);
        builder.setAutoCancel(true);
        builder.setLights(Color.GREEN, 500, 500);
        return builder.getNotification();
    }


Habe es mal mit festen IDs 1, 2 und 3 gemacht.
ich setzte am Anfang 3 Alarme mit unterschiedlichen Delays und IDs.
und lasse danach den Alarm mit der ID 3 canceln. Allerdings werden trotzdem alle 3 Alarme angezeigt. wieso??
 
Ich bin mir zwar nicht ganz sicher, aber deine Flags sind nicht gleich, dadurch auch dein PendingIntent nicht.
 
Perfekt ! Danke
 
Zurück
Oben Unten