2015-11-22 4 views
11

In Google In-App Billing Trivial Drive Beispiel ist eine BroadcastReceiver registriert, um Nachrichten über aktualisierte Käufe zu hören, nachdem die IabHelper-Installation erfolgreich abgeschlossen wurde.Warum ist die Registrierung von IabBroadcastReceiver in Activity eine schlechte Idee?

Der Autor hat jedoch den folgenden Hinweis enthalten:

Hinweis: ist eine schlechte Idee in einer Aktivität dieses Zuhörer registriert, wird aber hier getan, weil dies eine Probe.

Warum ist das eine schlechte Idee für diesen Zuhörer?

Dieser Kommentar kann in der OnIabSetupFinishedListener Definition im onCreate Verfahren von MainActivity im source code for the Trivial Drive sample

+3

Wenn die Aktivität zum Zeitpunkt des Empfangs nicht aktiv ist, erhalten Sie die Übertragung nicht. Wenn es im Manifest statisch registriert ist, wird der Empfänger von der Übertragung gestartet, auch wenn die Aktivität nicht ausgeführt wird. –

Antwort

2

Meine Vermutung zu finden ist, dass die BroadcastReceiver zerstört werden kann, wenn es in einem Activity ist. BroadcastReceiver s werden normalerweise im Manifest deklariert und nicht manuell vom Entwickler, sondern vom Betriebssystem instanziiert. Wenn es im Code registriert ist, ist die einzige Referenz, die das Android OS an die BroadcastReceiver hat, diese bestimmte Instanz, die an den Lebenszyklus der Activity gebunden ist, in der enthalten ist. Wenn das Activity zu speichern/zu beenden/gestoppt wurde, um Speicher zu sparen BroadcastReceiver innen deklariert würde höchstwahrscheinlich keine Updates erhalten.

2

Wie wir wissen, sollte der Rundfunkempfänger nicht mit Aktivitäten verbunden sein, die vom Aktivitätslebenszyklus getrennt werden sollten. Normalerweise sollte der Broadcast-Empfänger innerhalb der Androidmanifest-Datei definieren. Wenn Sie dies erlauben, können Sie das Update einfach abhören, wenn es für den Benutzer deutlich sichtbar ist, und vermeiden, dass Sie in Fällen, die für den Benutzer nicht lange sichtbar sind, in onStop/onDestroy registrieren.

Der beste Weg, um es mit Eventbus + Broadcast-Empfänger-Klasse zu implementieren. Definieren Sie den Empfänger in das Android-Manifest. Wenn das Update kommt, informiert es die Empfängerklasse. Wir feuern das Ereignis, das an jede Aktivität sendet, dass das Register-Ereignis diese Nachricht erhalten würde. Auf diese Weise können Sie innerhalb der Anwendung, in der Sie das Update benötigen, das Ereignis einfach abonnieren und anhören. Dank

1

Wenn wir einen BroadcastReceiver in Activity registrieren, ist sein Lebenszyklus an den Lebenszyklus der Activity gebunden. Wenn die Aktivität also destory ist, hat der Empfänger nicht funktioniert. Daher kann es keine Boardcasts empfangen, während die Aktivität nicht ausgeführt wird. Möglicherweise verlieren Sie den Boardcast, den der Benutzer kauft. In diesem Beispiel rufen wir immer mHelper.queryInventoryAsync(mGotInventoryListener); in der OnCreate() -Funktion der Aktivität. Daher machen wir uns keine Gedanken darüber, wie der Autor den Code kommentiert.

Verwandte Themen