Android Activity per Broadcast über Neuigkeiten notifizieren

Angenommen man hat folgendes Szenario:

  • dem Anwender wird gerade eine Activitiy angezeigt auf der z.B. ein Button “Aktualisieren” zu sehen ist
  • bei Klick auf diesen soll im Hintergrund ein Service starten der Dateien aus dem Internet herunter lädt
  • sobald der Service fertig mit dem Download ist, soll der Benutzer darüber irgendwie informiert werden

Hierzu bieten sich im ersten Augenblick zwei Möglichkeiten:

  1. der Service könnte eine Status Bar Notification anzeigen. Wenn der User diese dann anklickt könnte man eine neue Activity anzeigen
  2. der Service könnte einen Broadcast senden. Der empfangende, ganz normal in der AndroidManifest.xml registrierte, BroadcastReceiver könnte dann wiederum entscheiden wie es weiter gehen soll. Z.B. auch wieder eine neue Activity starten


In meinem Fall möchte ich jedoch keines von beiden. Ich möchte einfach nur dass sich die gerade angezeigte Activity refreshed. Auch hierfür gibt es zum Glück eine Möglichkeit, die allerdings nicht all zu geläufig ist (zumindest nicht dort wo ich recherchiert habe ;) ): wenn der Service mit dem Download fertig ist, sendet er einen ganz normalen Broadcast. Den empfangenden BroadcastReceiver registriert man jedoch nicht in der AndroidManifest.xml, sondern direkt im Code der Activity per registerReceiver(). Wichtig hierbei ist dass der BroadcastReceiver keine separate Klasse ist, sondern inline als innere Klasse in der Activity beschrieben ist. Dadurch dass der BroadcastReceiver eine innere Java Klasse ist, kann er auf sämtliche Methoden der äußeren Activity zugreifen. Somit auch auf eine “refresh()” Methode.

Der Code könnte folgendermaßen aussehen:

package de.echooff.android.helloandroid;
 
import android.app.Activity;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.os.Bundle;
import de.echooff.android.helloandroid.R;
 
public class MeineActivity extends Activity {
    private final BroadcastReceiver meinReceiver = new BroadcastReceiver() {
        @Override
        public void onReceive(Context context, Intent intent) {
            refresh();
        }
    };
 
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.meinLayout);
    }
 
    @Override
    protected void onResume() {
        super.onResume();
        registerReceiver(meinReceiver,
            new IntentFilter("de.echooff.android.helloandroid.DOWNLOAD_FINISHED"));
    }
 
    @Override
    protected void onPause() {
        // Immer sauber aufräumen
        super.onPause();
        unregisterReceiver(meinReceiver);
    }
 
    private void refresh() {
        // Anzeige aktualisieren		
    }
}

Der Service der nun den Broadcast senden möchte, muss nur als Action “de.echooff.android.helloandroid.DOWNLOAD_FINISHED” angeben und fertig.

Getagged mit: , , , ,
Veröffentlicht unter Android, HowTo