plusone

13. Oktober 2011

Die Arbeit von APPs Dritter erledigen lassen

Guten Abend,

ich hab euch HIER schon Einmal geschildert, wie die Kommunikation zwischen APPs mit Hilfe von der Manifestdatei zustande kommt. Heute will ich euch BroadcastReceiver zeigen und wie ihr eure Arbeit auf andere abwälzen könnt.


BroadcastReceiver das Stichwort ist gefallen. Es gibt eine Ansammlung von Action-Befehlen, die vom System oder von APPs Dritter kontinuierlich oder bei Ereignissen ausgelöst werden. Beispiele sind dafür "SMS angekommen", "eingehender Anruf" oder auch "Benutzer ist anwesend". Hier ist ein der String von shutdown, der für den Actionbefehl genutzt wird, wenn das System gerade runter fährt. Diese Link führt euch auch direkt auch zu paar mehr :)

Aber wie können wir das nun im Code einbinden?
  1. Als erstes BroadcastReceiver instanzieren
  2. IntentFilter mit der Action instanzieren
  3. und dann nur noch den Receiver registrieren
BroadcastReceiver broadcastReceiver = new BroadcastReceiver() {

    @Override
    public void onReceive(Context context, Intent intent) {
        Log.d("test", intent.getAction());
    }
};

IntentFilter intentFilter = new IntentFilter(Intent.ACTION_TIME_TICK);

registerReceiver(broadcastReceiver, intentFilter);
// Beim Beenden eurer APP nicht vergessen wieder den Receiver
// loszulassen!
// unregisterReceiver(broadcastReceiver);


In meinem Beispiel würde mein Receiver wegen der Action ACTION_TIME_TICK jede volle Minute ein Paket empfangen. Mein Log sieht dementsprechend aus:
10-13 18:17:00.080: DEBUG/test(18036): android.intent.action.TIME_TICK
10-13 18:18:00.080: DEBUG/test(18036): android.intent.action.TIME_TICK
10-13 18:19:00.070: DEBUG/test(18036): android.intent.action.TIME_TICK
10-13 18:20:00.070: DEBUG/test(18036): android.intent.action.TIME_TICK
10-13 18:21:00.070: DEBUG/test(18036): android.intent.action.TIME_TICK
10-13 18:22:00.070: DEBUG/test(18036): android.intent.action.TIME_TICK
10-13 18:23:00.099: DEBUG/test(18036): android.intent.action.TIME_TICK
10-13 18:24:00.080: DEBUG/test(18036): android.intent.action.TIME_TICK


Wie ihr seht, einfach! Und ihr musstet nicht ma jede Sekunde die Zeit abfangen und prüfen, wann die nächste volle Sekunde ist, um nur jede voll Minute zu reagieren.

Solltet ihr vergessen unregisterReceiver(BroadcastReceiver) beim Beender eurer APP aufzurufen, kriegt ihr so eine Exception:

10-13 18:30:04.839: ERROR/ActivityThread(18036): android.app.IntentReceiverLeaked: Activity de.alexroid.test.Test has leaked IntentReceiver de.alexroid.test.Test$1@46127a10 that was originally registered here. Are you missing a call to unregisterReceiver()?


Viel Erfolg mit den BroadcastReceivern!

regards
Alexander Fink

BroadcastReceiver Part 2 - per AndroidManifest

Keine Kommentare:

Kommentar veröffentlichen