W mojej aplikacji tworzę niestandardowy BroadcastReceiver
i ręcznie rejestruję go w moim kontekście za pośrednictwem Context.registerReceiver
. Mam też wiadomość, AsyncTask
która wysyła notifier-Intents przez Context.sendBroadcast
. Intencje są wysyłane z wątku roboczego innego niż UI, ale wydaje się, że BroadcastReceiver.onReceive
(który odbiera wspomniane intencje) zawsze działa w wątku interfejsu użytkownika (co jest dla mnie dobre). Czy to jest gwarantowane, czy nie powinienem na tym polegać?
android
broadcastreceiver
Hannes Struß
źródło
źródło
onCreate()
,onReceive()
) są nazywane w głównym wątku aplikacji. Jest to udokumentowane w dokumentacjionReceive()
: goo.gl/8kPuHonReceive()
jest wywoływany w wątku innym niż główny wątek aplikacji („UI”).Ponieważ dynamicznie rejestrujesz odbiornik, możesz określić, że inny wątek (inny niż wątek interfejsu użytkownika) obsługuje plik
onReceive()
. Odbywa się to za pomocą parametru Handler funkcji registerReceiver () .To powiedziawszy, jeśli nie określisz innego programu obsługi, będzie on zawsze obsługiwany w wątku interfejsu użytkownika.
źródło
Zwykle wszystko zależy od sposobu rejestracji.
Jeśli zarejestrujesz się
BroadcastReceiver
za pomocą:Będzie działać w głównym wątku aktywności (aka wątku interfejsu użytkownika) .
Jeśli zarejestrujesz się
BroadcastReceiver
przy użyciu ważnegoHandler
działającego w innym wątku :Będzie działać w kontekście twojego
Handler
Na przykład:
Szczegóły tutaj i tutaj .
źródło
Jak poprawnie podano poprzednie odpowiedzi,
onReceive
będzie działać w wątku, w którym jest zarejestrowany, jeśliregisterReceiver()
wywoływany jest smak, który akceptuje funkcję obsługi - w przeciwnym razie w wątku głównym.Z wyjątkiem sytuacji, gdy odbiorca jest zarejestrowany w usłudze,
LocalBroadcastManager
a transmisja odbywa się za pośrednictwemsendBroadcastSync
- gdzie najwyraźniej będzie działać w wywoływanym wątkusendBroadcastSync.
źródło
and the broadcast is via sendBroadcastSync
. Kiedy używamyLocalBroadcastManager
do rejestrowania odbiornika, musi być wywoływany przez główny wątek, niezależnie od tego, czy używasz,sendBroadcastSync
czysendBroadcast
. Więc kluczem jest użycieLocalBroadcastManager
do rejestracji. Czy mam rację?TAK Context.registerReceiver (odbiornik BroadcastReceiver, filtr IntentFilter, String broadcastPermission, harmonogram obsługi)
źródło