Di App saya, saya membuat custom BroadcastReceiver
dan mendaftarkannya ke Context saya secara manual melalui Context.registerReceiver
. Saya juga memiliki AsyncTask
yang mengirimkan notifier-Intents via Context.sendBroadcast
. Maksud dikirim dari utas pekerja non-UI, tetapi tampaknya BroadcastReceiver.onReceive
(yang menerima maksud tersebut ) selalu berjalan di utas UI (yang bagus untuk saya). Apakah ini dijamin atau haruskah saya tidak mengandalkan itu?
android
broadcastreceiver
Hannes Struß
sumber
sumber
onCreate()
,onReceive()
) dipanggil pada thread aplikasi utama. Dan, itu didokumentasikan di dokumen untukonReceive()
: goo.gl/8kPuHonReceive()
dipanggil pada utas selain utas aplikasi utama ("UI").Karena Anda mendaftarkan penerima secara dinamis, Anda dapat menentukan bahwa utas lain (selain utas UI) menangani
onReceive()
. Ini dilakukan melalui parameter Handler dari registerReceiver () .Karena itu, jika Anda tidak menentukan Handler lain, itu akan selalu ditangani pada UI thread.
sumber
Biasanya, semuanya tergantung bagaimana Anda mendaftarkannya.
Jika Anda mendaftar
BroadcastReceiver
menggunakan:Ini akan berjalan di utas aktivitas utama (alias utas UI) .
Jika Anda mendaftar
BroadcastReceiver
menggunakan valid yangHandler
berjalan di utas berbeda :Ini akan berjalan dalam konteks Anda
Handler
Sebagai contoh:
Detail di sini & di sini .
sumber
Karena jawaban sebelumnya yang dinyatakan dengan benar
onReceive
akan berjalan di utas yang didaftarkan jika flavorregisterReceiver()
yang menerima penangan dipanggil - sebaliknya di utas utama.Kecuali jika penerima terdaftar dengan
LocalBroadcastManager
dan siaran melaluisendBroadcastSync
- di mana tampaknya akan berjalan di utas yang memanggilsendBroadcastSync.
sumber
and the broadcast is via sendBroadcastSync
. Ketika kami gunakanLocalBroadcastManager
untuk mendaftarkan penerima, itu harus dipanggil oleh utas utama apakah menggunakansendBroadcastSync
atausendBroadcast
. Jadi kuncinya adalah menggunakanLocalBroadcastManager
untuk mendaftar. Apakah saya benar?YES Context.registerReceiver (penerima BroadcastReceiver, filter IntentFilter, String broadcastPermission, Handler scheduler)
sumber