2012-07-27 13 views
5

Ich versuche, den Status einer Benutzeroberfläche beim Empfang einer Push-Benachrichtigung zu aktualisieren. Um dies zu tun, muss ich eine AsyncTask starten, die einige Netzwerkoperationen durchführt und dann die Benutzeroberfläche basierend auf dem Ergebnis aktualisiert.Verwenden eines BroadcastReceivers zum Starten einer AsyncTask

Gemäß der Dokumentation für BroadcastReceiver ist die Ausführung von asynchronen Operationen in einem Empfänger unsicher, da der ausführende Prozess abgebrochen werden kann, sobald onReceive() zurückgegeben wird, vorausgesetzt, es gibt keine anderen "Anwendungskomponenten" in diesem Prozess.

Wird die BroadcastReceiver in einem eigenen Prozess ausgeführt, oder in demselben Prozess wie die enthaltene Aktivität? Da ich mich nur um den Abschluss der Aufgabe sorge, solange eine Benutzeroberfläche aktualisiert werden muss, mache ich mir keine Sorgen darüber, dass AsyncTask stirbt, wenn die Aktivität geschlossen wird. Angenommen, der BroadcastReceiver befindet sich im selben Prozess wie die Aktivität, macht es also OK/sicher, die Aufgabe, die ich im Empfänger beschrieben habe, zu starten?

Edit:

Um zu klären, ich bin mit dem Empfänger in der Tätigkeit der Registrierung onResume() und Deregistrierung es onPause(), so sollte es nur Absichten werden empfangen, wenn die Aktivität bereits aktiv ist.

+0

Warum nicht einen 'Service' anstelle von BroadcastReceiver verwenden, wenn es unsicher ist? Es würde dasselbe erreichen, aber ohne das Problem, von dem du sprichst. – Andy

+0

@Andy Ich verstehe, dass die Verwendung eines "Service" unter allen Umständen sicher ist, aber ich versuche zu bestimmen, ob es in diesem speziellen Fall wirklich notwendig ist. – jnackman

+1

Gut ist es, wenn Sie darüber nachdenken. Dienste sind perfekt zum Ausführen von asynchronen Operationen. Daher warum ist die gleiche Einschränkung nicht vorhanden. BroadcastReceiver werden hauptsächlich für andere Dinge verwendet, z. B. wenn etwas im System passiert, nicht wirklich, wenn Daten über das Internet aktualisiert werden. Daher "Broadcast". Während ein "Dienst" das ist, was er ist, läuft ein Dienst auf der Seite, über die der Benutzer nichts wissen muss. Hoffentlich macht das Sinn. – Andy

Antwort

5

Broadcast-Empfänger läuft nicht auf seinem eigenen Prozess, es läuft auf UI-Thread.

Ihr Prozess wird beendet, nachdem die onReceive-Methode nur zurückgegeben wurde, wenn keine anderen Aktivitäten oder Dienste in Ihrer App ausgeführt werden.

Wenn Ihr Broadcast-Empfänger eine Instanz einer inneren Klasse ist und nur empfangen wird, wenn Ihre Aktivität aktiv ist, wird Ihr Prozess nicht beendet, nachdem die onReceive-Methode zurückgegeben wurde.

+0

[Link zur offiziellen Dokumentation] (http://developer.android.com/reference/android/content/BroadcastReceiver.html#ProcessLifecycle) – renadeen

0

Was ich empfehlen würde, ist startActivity(intent) aus dem Rundfunkempfänger. Das ist alles. In der Absicht würde ich die Ereignisinformation angeben, von der Sie sprechen, Sie können einfach einen Parameter im Bündel setzen. Sie können dies dann in der Aktivität onStart() oder onCreate() überprüfen, je nachdem, welcher Anrufer aufgerufen wird. Wenn die Flagge da ist, dann von Activity den AsyncTask starten.

Es ist nicht nötig, einen Dienst zu verwenden, mit allen Einschränkungen der Verbindung und Kommunikation von Service-Aktivitäten.

Denken Sie daran, Sie können auch startActivityForResult() als auch. Ich denke, dass du nichts anderes tun willst, als innerhalb eines Rundfunkempfängers vor und zurück zu gehen.

BTW, Aktivitäten müssen nicht UIs haben. Es kann gesichtslose Aktivitäten geben.

+0

Wie du bereits erwähnt hast - _ ... müssen die Aktivitäten nicht UI's haben - dann habe ich empfehle ihm den Service ... Ich dachte, dass Aktivitäten für UI und Services für Hintergrundaufgaben verwendet werden. –

1

Wenn in Ihrem AsyncTask, brauchen Sie einen Kontext, dann denke ich, ein Service ist besser. Wenn nicht, gibt es kein Problem mit AsyncTask.

1

Vor Honeycomb (API11) mussten Sie einen Dienst verwenden.

Da Honeycomb (API11) können Sie goAsync() verwenden:

Dies kann durch eine Anwendung in OnReceive (Context, Intent) zu erlauben es die Sendung von dieser Funktion nach der Rückkehr aktiv zu halten aufgerufen werden .Dies ändert nichts an der Erwartung, relativ zu der Broadcast-Nachricht zu sein (innerhalb von 10 Sekunden), aber erlaubt die Implementierung, um die damit verbundene Arbeit auf einen anderen Thread zu verschieben, um den Haupt-UI-Thread aufgrund von Disk IO zu vermeiden.

Verwandte Themen