Apps für Android programmieren leicht gemacht!
AlarmManager

AlarmManager

Du möchtest in deiner App gerne in regelmäßigen Abständen und im Hintergrund Aufgaben ausführen, obwohl deine App vom Nutzer eigentlich geschlossen wurde?

Dann ist der AlarmManager von Android wahrscheinlich genau das Richtige für dich.
Mit Hilfe des AlarmManagers von Android ist es dir möglich alle möglichen Dinge im Hintgrund auszuführen, die keinen direkten oder indirekten Einfluss auf das UI von Android haben.

Ich selber nutze den AlarmManager in diversen Apps, um in regelmäßigen Intervallen neueste Updates einiger Newsfeeds zu laden und bei neuen News gegebenenfalls eine Benachrichtigung anzeigen zu lassen.

 

Vorbereitungen:

Eine Berechtigung ist nicht nötig, allerdings müssen wir eine neue und unabhändige Klasse erstellen und diese in die AndroidManifest.xml Datei eintragen.

Wir öffnen dazu die Datei „AndroidManifest.xml“-Datei und schreiben innerhalb des Tags „<application>“:

<receiver android:name='.NewsUpdate'>
</receiver>

Wie ihr sehen könnt haben wir soeben einen Eintrag in der Datei gemacht, um einen unabhängigen Receiver names „NewsUpdate“ zu registrieren.
Es gilt nun eine Klasse mit diesem Namen zu erstellen und sie als Receiverklasse zu definieren.

 

NewsUpdate-Klasse:

Wir erstellen also die Klasse „NewsUpdate“ und erweitern sie mit einem BroadcastReceiver.

public class NewsUpdate extends BroadcastReceiver{
    @Override
    public void onReceive(final Context context, Intent intent) {
        // Diese Methode wird später aufgerufen, wenn der AlarmManager auslöst. Hier sollten also alle nötigen Befehle rein, die ausgeführt werden sollen.
    }
}

 

Haben wir diese Klasse erstellt bedarf es zwei weiteren Methoden, die aufgerufen werden, um den AlarmManager zu starten/beenden.

public void setService(Context context) {
    AlarmManager am = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
    Intent i = new Intent(context, NewsUpdate.class);
    PendingIntent pi = PendingIntent.getBroadcast(context, 0, i, 0);
    am.setRepeating(AlarmManager.RTC_WAKEUP, System.currentTimeMillis(), 1000 * 60 * 50, pi); // Millisekunden * Sekunden * Minuten
}

public boolean cancelService(Context context) {
    Intent intent = new Intent(context, NewsUpdate.class);
    PendingIntent sender = PendingIntent.getBroadcast(context, 0, intent, 0);
    AlarmManager alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
    alarmManager.cancel(sender);

    return true;
}

Wie man in der 5. Zeile sehen kann errechnen wir die Zeit in Millisekunden nach der der AlarmManager die Klasse „NewsUpdate“ erneut ausführen soll. In unserem Fall sind es genau 50 Minuten, nach der die Klasse in regelmäßigen Abständen wieder aufgerufen werden soll.
Euch steht natürlich frei einzustellen wie oft der AlarmManager auslösen soll. Behaltet aber im Auge, dass ein kürzerer Intervall auch in erhöhtem Akkuverbrauch und möglicherweise erhöhtem Datenverbrauch resultieren kann.

 

AlarmManager starten:

Mein Vorschlag zum Starten des AlarmManagers sieht wie folgt aus:

  • Wir starten bei jedem Aufruf der normalen App auch den AlarmManager.
  • Weil wir den AlarmManager, für ein und die selbe Klasse, mehrfach starten können beenden wir den vorherigen AlarmManager.
  • Damit wir beim ersten Start der App nicht in einen Fehler laufen müssen wir prüfen, ob überhaupt ein AlarmManager für uns registriert ist.

Diese Vorgehensweise hat einen bestimmten Grund.
Wir nehmen an, dass wir alle 50 Minuten auf neue News aus unserem NewsFeed prüfen wollen. Gibt es neue News, dann laden wir diese runter und zeigen eine Banchrichtigung an.
Wird unsere App allerdings nach 45 Minuten gestartet, so werden die neuesten News so oder so heruntergeladen. Es wäre also recht sinnlos in weiteren 5 Minuten erneut zu prüfen.
Wir starten die Newssuche neu, indem wir den AlarmManager beenden, neu öffnen und so die 50 Minuten Intervalle neu starten.

boolean alarmUp = (PendingIntent.getBroadcast(this, 0,
new Intent("[PackageName deiner App].NewsUpdate"),
PendingIntent.FLAG_NO_CREATE) != null);

// Der AlarmManager läuft bereits, also beende ihn.
if(alarmUp){
    ls.cancelService(this);
}

// Starte den AlarmManager
ls.setService(this);

 

 

Marvin

Ich bin 23 Jahre jung und studiere zurzeit Wirtschaftsinformatik an der Georg-August-Universität in Göttingen. Ich bin ein Mensch, der sich neben der Programmierung noch für tausend andere Dinge interessiert, die mal mehr und mal weniger verrückt sind. Vor allem aber bin ich Feuer und Flamme mit der Programmierung von eigenen kleinen Apps und Programmen, die mein Leben bereichern.

Kommentar hinzufügen

*Pflichtfeld