2010-09-06 7 views
18

Ich versuche, die wichtigsten Unterschiede zwischen der Registrierung eines BroadcastReceiver im Manifest und Registrierung es programmatisch zu verstehen ...Hauptunterschied zwischen Manifest und Programmatische Registrierung von BroadcastReceiver

Mein Verständnis ist im Grunde wie folgt (würde schätzen, jemand zu korrigieren mein Punkte, wenn ich etwas vermisse).

  • in Manifest Registriert:

    1. Das OS wird auf magische Weise finden und Ihre Klasse instanziiert, wenn nötig, die OnReceive() -Methode aufrufen, egal, was der Betriebszustand der Anwendung war
    2. Ihr erhalten wird nur einmal pro Broadcast aufgerufen (dh Sie können davon ausgehen, dass die Registrierung im Manifest der Registrierung Ihrer "Klasse" für den Empfang der Broadcast entspricht - und die Broadcast instanziiert Ihre Klasse nach Bedarf) (??)
  • Registrierte Programmatically:

    1. in Code Registrierung bedeutet, dass Sie Instanzen Ihrer Klasse registrieren Broadcast-Nachrichten zu empfangen (d Wenn Ihr Code ein wenig schlampig ist und Sie sich mehrfach registrieren, werden Sie mehrere BroadcastReceiver-Instanzen haben, deren onReceive() -Aufruf für eine Übertragung
    2. zur Registrierung aufgehoben wird. Sie müssen die spezifische BroadcastReceiver-Instanz, die Sie haben, aufheben zuvor registrierten
    3. , wenn Ihre Anwendung durch das Betriebssystem, Ihre OnReceive() -Methode für eine Übertragung
    4. nicht

dank

Antwort

18

Sie haben es grundsätzlich richtig zerstört wird aufgerufen werden.

Beachten Sie, dass ein Manifest-registriertes Empfängerobjekt nur einmal verwendet wird. Eine neue Instanz Ihrer BroadcastReceiver wird für jede Sendung erstellt. Die primäre Verwendung von Manifest-registrierten Empfängern ist für Übertragungen, die weitergehen können, während sich Ihr Code nicht im Speicher befindet (z. B. BOOT_COMPLETED, Ihre geplanten Alarme über AlarmManager).

+0

Und ich denke, wenn Ihr Dienst abstürzt, wo Ihr broadcastreceiver im Manifest deklariert ist, empfängt der Empfänger immer noch die Nachrichten ... – Boy

+0

@Boy: Ja, sollte es. – CommonsWare

+0

bitte können Sie nachschlagen, wenn das mit meinem Problem in Verbindung stand: http://StackOverflow.com/Questions/29728000/Wifi-changed-Status-Affecting-My-App –

0

Ihr Verständnis ist meiner Meinung nach korrekt.

Ein weiterer relevanter (und obskurer) Unterschied ist, dass einige spezifische System Intents nur dann Ihren Empfänger auslösen, wenn er programmgesteuert registriert ist. Empfänger, die nur im Manifest definiert sind, werden nicht aufgerufen. Beispiele sind: ACTION_SCREEN_ON, ACTION_SCREEN_OFF, ACTION_BATTERY_CHANGED, ACTION_HEADSET_PLUG

Ich würde dieses text empfehlen, die verschiedene Details über Intents und -Empfänger erwähnt.

+0

Nun, ich habe es geschafft, einen Empfänger für ACTION_SCREEN_ON über das Manifest zu registrieren und es funktioniert – jonney

4

Wenn die Methode zu verwenden

Welche Methode für die Registrierung Ihres BroadcastReceiver hängt verwenden, um zu registrieren, was Ihre Anwendung tut mit dem Systemereignis.Ich denke, es gibt grundsätzlich zwei Gründe, warum Ihre App will über systemweite Ereignisse wissen:

  1. Ihre App bietet eine Art von Service rund um diese Veranstaltungen

  2. Ihre App will gnädig auf Statusänderungen reagieren

Beispiele für die erste Kategorie sind Anwendungen, die, sobald das Gerät gebootet arbeiten müssen oder dass muss irgendeine Art von Arbeit beginnen, wenn eine App installiert ist. Battery Widget Pro oder App2SD sind gute Beispiele für diese Art von Apps. Für diesen Typ müssen Sie den BroadcastReceiver in der Manifest-Datei registrieren.

Beispiele für die zweite Kategorie sind Ereignisse, die eine Änderung der Umstände anzeigen, auf die sich Ihre App verlassen könnte. Angenommen, Ihre App hängt von einer bestehenden Bluetooth-Verbindung ab. Sie müssen auf eine Zustandsänderung reagieren - aber nur, wenn Ihre App aktiv ist. In diesem Fall ist kein statisch registrierter Rundfunkempfänger erforderlich. Ein dynamisch registrierter wäre vernünftiger.

Es gibt auch einige Ereignisse, für die Sie sich nicht einmal statisch registrieren können. Ein Beispiel dafür ist das Intent.ACTION_TIME_TICK-Ereignis, das jede Minute gesendet wird. Dies ist eine weise Entscheidung, da ein statischer Empfänger die Batterie unnötig entleeren würde.

Verwandte Themen