In meiner App erstelle ich eine benutzerdefinierte BroadcastReceiver
und registriere sie manuell über in meinem Kontext Context.registerReceiver
. Ich habe auch eine AsyncTask
, die Notifier-Intents über versendet Context.sendBroadcast
. Die Absichten werden von einem Nicht-UI-Worker-Thread gesendet, aber es scheint, dassBroadcastReceiver.onReceive
(der empfängt) immer im UI-Thread ausgeführt wird (was gut für mich ist). Ist das garantiert oder sollte ich mich nicht darauf verlassen?
android
broadcastreceiver
Hannes Struß
quelle
quelle
onCreate()
,onReceive()
) auf dem Hauptanwendungsthread bezeichnet. Und es ist in den Dokumenten dokumentiert füronReceive()
: goo.gl/8kPuHonReceive()
, in dem ein anderer Thread als der Hauptanwendungsthread ("UI") aufgerufen wird.Da Sie den Empfänger dynamisch registrieren, können Sie angeben, dass ein anderer Thread (außer dem UI-Thread) das behandelt
onReceive()
. Dies erfolgt über den Handler-Parameter von registerReceiver () .Wenn Sie jedoch keinen anderen Handler angegeben haben, wird dieser immer im UI-Thread behandelt.
quelle
Normalerweise hängt alles davon ab, wie Sie es registrieren.
Wenn Sie Ihre
BroadcastReceiver
Verwendung registrieren :Es wird im Hauptaktivitätsthread (auch als UI-Thread bezeichnet) ausgeführt .
Wenn Sie sich
BroadcastReceiver
mit einem gültigenHandler
Lauf auf einem anderen Thread registrieren :Es wird im Kontext Ihres ausgeführt
Handler
Beispielsweise:
Details hier & hier .
quelle
Wie die vorherigen Antworten richtig angegeben,
onReceive
wird auf dem Thread ausgeführt, bei dem es registriert ist, wenn der Geschmack vonregisterReceiver()
, die einen Handler akzeptiert, aufgerufen wird - andernfalls auf dem Hauptthread.Außer wenn der Empfänger bei der registriert ist
LocalBroadcastManager
und die Sendung über erfolgtsendBroadcastSync
- wo sie anscheinend auf dem Thread läuft, der anruftsendBroadcastSync.
quelle
and the broadcast is via sendBroadcastSync
. Wenn wirLocalBroadcastManager
den Empfänger registrieren, muss er vom Hauptthread aufgerufen werden, ob usesendBroadcastSync
odersendBroadcast
. Der Schlüssel ist also, sichLocalBroadcastManager
zu registrieren. Habe ich recht?JA Context.registerReceiver (BroadcastReceiver-Empfänger, IntentFilter-Filter, String BroadcastPermission, Handler-Scheduler)
quelle