6 Stimmen

Anwendung zwangsweise stoppen - hebt auch alle Alarme auf, die sie gesetzt hatte?

Meine App stellt einen Alarm ein:

AlarmManager mgr = (AlarmManager)context.getSystemService(Context.ALARM_SERVICE);
mgr.setRepeating(
  AlarmManager.RTC_WAKEUP, 
  firstRun, 
  interval, 
  makePendingIntent(context));

Funktioniert gut. Wenn ich in den Systemeinstellungen -> Anwendungen gehe und meine Anwendung zwangsweise stoppe, scheint dies auch dazu zu führen, dass alle Alarme, die ich geplant hatte, gelöscht werden. Stimmt das? Wenn ja, befinde ich mich in einer merkwürdigen Situation, in der meine zuletzt bekannten Einstellungen besagen, dass der Benutzer den Alarm tatsächlich eingestellt hatte, das System aber möglicherweise hinter meinem Rücken abgebrochen hat, so dass ich dem Benutzer jetzt den falschen Status anzeige, ob der Alarm eingestellt ist oder nicht.

Gracias

2voto

lapis Punkte 6494

Ja, das ist wahr. Alles, was Sie tun können, ist, soweit ich weiß, Ihren Status zu verbessern. Um zu überprüfen, ob Ihre Alarme noch vorhanden sind, müssen Sie 2 Schritte unternehmen:

  1. Versuchen Sie, Ihre PendingIntent con FLAG_NO_CREATE - die Funktion checkPendingIntent wird genau so sein wie makePendingIntent mit Ausnahme dieser Flagge in PendingIntent.getBroadcast und eine Überprüfung des Ergebnisses - ob der Alarm auf normale Weise abgebrochen wurde (natürlich von Ihnen selbst, wenn Sie die cancel() für Ihre PendingIntent s) oder wenn Ihre Anwendung ohne Force Stop (d.h. mit einer nicht abgefangenen Ausnahme) abgestürzt ist, PendingIntent.getBroadcast wird null zurückgeben.
  2. Wenn der PendingIntent vorhanden ist, kann Ihr Alarm ausgelöst werden. Um dies zu überprüfen, müssen Sie die Systeminformationen über alle Alarme auslesen und dort nach Ihrem Alarm suchen. Um die Informationen auszulesen, müssen Sie Folgendes aufrufen

    String collectAlarmsInfo() {
        StringBuilder result = new StringBuilder();
        try {
            Process process = Runtime.getRuntime().exec("dumpsys alarm");
            BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(process.getInputStream()));
    
            String line;
            while ((line = bufferedReader.readLine()) != null) {
                result.append(line);
                result.append("\n");
            }
        } catch (IOException e) {
            Log.e(TAG, "Could not retrieve data", e);
        }
        return result.toString();
    }

    Um dumpsys zu verwenden, benötigen Sie die Benutzerberechtigung DUMP. Wenn Sie den Dump haben, können Sie Ihre Alarme anhand des Paketnamens identifizieren, d.h. die Prüfung lautet

    boolean alarmIsSet = collectAlarmsInfo().contains(<your package name>);

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X