2012-04-07 31 views
0

Ich habe eine Homework Planner-Anwendung, für die ich einen Alarm erstellen möchte, um Benutzer an die Hausaufgaben am Vorabend/zu einer bestimmten Zeit zu erinnern. Ich habe eine Aktivität namens AddNewHomework, bei der der Benutzer ein neues Hausaufgabenelement erstellt und es zur Datenbank hinzufügt. Dieser Code wird dann aufgerufen.Android AlarmManager - Abbrechen von einer anderen Aktivität

Intent i = new Intent(this, AlarmNotificationReceiver.class); 
i.putExtra("title", title); 
PendingIntent pi = PendingIntent.getBroadcast(this.getApplicationContext(), (int) id, i, 0); 
AlarmManager mAlarm = (AlarmManager) getApplicationContext().getSystemService(Context.ALARM_SERVICE); 
mAlarm.set(AlarmManager.RTC_WAKEUP, 
System.currentTimeMillis() + 10 * 1000, pi); 

Dies erstellt einen neuen Alarm, der in 10 Sekunden ausgelöst wird und eine Benachrichtigung erstellt.

Mein Problem ist, dass ich eine andere Aktivität namens HomeworkList habe, die eine ListView enthält und alle in der Datenbank gespeicherten Homeworks anzeigt. Wenn ein Benutzer lange auf eins klickt, hat er die Möglichkeit, es zu löschen, aber das Entfernen aus der Datenbank wird den Alarm nicht entfernen.

Ich habe nach Code gesucht, den ich verwenden kann, um den Alarm zu entfernen, aber ich habe nichts gefunden, was mir erlaubt zu verstehen, wie der Alarm von dieser anderen Aktivität abgebrochen wird. Ich weiß, dass ich den PendingIntent gleich machen muss, aber wie mache ich das, weil ich nicht auf den Kontext von der anderen Klasse zugreifen kann. (Ich denke nicht).

+0

Sie haben versucht, 'mallarm.cancel (PendingIntent);' zum Abbrechen des Alarmmanagers? –

+0

@imrankhan Ich habe, aber ich brauche eine identische PendingIntent für sie den Alarm zu finden und abzubrechen. Mein Problem ist das Erstellen der gleichen PendingIntent – TomRichardson

Antwort

1

Wenn es hilft, können Sie aus einer anderen Aktivität auf Ihren Kontext zugreifen, indem Sie einen statischen Getter für den aktuellen Kontext erstellen. In Ihrer obigen Klasse, nur ein privates Feld machen:

private static Context context; 

public static Context getAppContext(){ 
    return MyActivity.context; 
} 

dann einfach in der onCreate Methode ein hinzuzufügen:

MyActivity.context = getApplicationContext(); 

den Zusammenhang von einer anderen Aktivität Zugriff ist jetzt ziemlich einfach. Sie können den aus "MyActivity" abgerufenen Kontext verwenden, um den Alarm abzubrechen.

+0

Funktioniert perfekt, danke sehr! – TomRichardson

+0

können Sie ein wenig mehr erklären. Ich mochte Ihren Vorschlag, auf den Kontext in einer Adapterklasse zuzugreifen, aber ich hatte keinen Erfolg. kannst du plz helfen. – Ranjit

+0

Können Sie mehr Details erklären, wo kann ich diesen Code in meine beiden Aktivitäten einfügen (Aktivität zum Aktivieren des Alarms und Aktivität zum Abbrechen des Alarms)? –

1

Entsprechend dieser Android: Does context affect filterEquals(), used to cancel alarm? spielt es keine Rolle, wenn Sie verschiedene Kontexte verwenden, dies hat keinen Einfluss auf die Erkennung des PendingIntent als übereinstimmend. Ich habe dies in meiner eigenen App bestätigt. Ich habe einen Alarm aus einer Aktivität gesetzt, indem ich die Aktivität als Kontext verwendet habe, und eine andere Aktivität über den Kontext dieser Aktivität abgebrochen. Die Aktion wurde abgebrochen (die Aktion wurde nicht ausgelöst).

Verwandte Themen