BroadcastReceiver di Android sono iniziati in una nuova discussione?

Se ho una class interna che estende BroadcastReceiver all’interno della mia class Service , dovrei preoccuparmi della sincronizzazione, quando la class BroadcastReceiver legge / scrive su oggetti dalla class Service ? O per dirla in un altro modo: I BroadacstReceiver onReceive() iniziati in un thread aggiuntivo?

Solutions Collecting From Web of "BroadcastReceiver di Android sono iniziati in una nuova discussione?"

Il metodo onReceive () viene sempre chiamato sul thread principale (che viene anche chiamato “thread UI”), a meno che non sia stato pianificato su un thread diverso usando la variante registerReceiver ():

 Context.registerReceiver(BroadcastReceiver receiver, IntentFilter filter, String broadcastPermission, Handler scheduler) 

BroadcastReceiver di Android sono iniziati in una nuova discussione?

Di solito, tutto dipende da come lo si registra.

Se registri il tuo BroadcastReceiver usando:

 registerReceiver(BroadcastReceiver receiver, IntentFilter filter) 

Verrà eseguito nel thread di attività principale (noto anche come thread dell’interfaccia utente) .

Se registri il tuo BroadcastReceiver utilizzando un Handler valido in esecuzione su un thread diverso:

 registerReceiver (BroadcastReceiver receiver, IntentFilter filter, String broadcastPermission, Handler scheduler) 

Funzionerà nel contesto del tuo Handler

Per esempio:

 HandlerThread handlerThread = new HandlerThread("ht"); handlerThread.start(); Looper looper = handlerThread.getLooper(); Handler handler = new Handler(looper); context.registerReceiver(receiver, filter, null, handler); // Will not run on main thread 

Dettagli qui e qui .

Il metodo onReceive () viene chiamato sul thread principale. Quindi, nel caso in cui tutti gli accessi alla class di servizio avvengano all’interno del thread principale, non è necessaria alcuna sincronizzazione.

Inoltre, puoi specificare l’attributo dell’elemento ricevitore “android: process” in AndroidManifest.xml. Vedi qui In questo modo è ansible specificare che il ricevitore viene eseguito come processo separato e non è legato al thread dell’interfaccia utente principale.