programing tip

BroadcastReceiver.onReceive는 항상 UI 스레드에서 실행됩니까?

itbloger 2020. 7. 28. 08:02
반응형

BroadcastReceiver.onReceive는 항상 UI 스레드에서 실행됩니까?


내 앱에서 사용자 지정을 만들고 BroadcastReceiver를 통해 수동으로 내 컨텍스트에 등록합니다 Context.registerReceiver. AsyncTask또한를 통해 notifier-Intents를 전달 하는 가지고 있습니다 Context.sendBroadcast. 의도는 UI가 아닌 작업자 스레드에서 전송되지만 BroadcastReceiver.onReceive(의도를받은) UI 스레드에서 항상 실행되는 것 같습니다 (나에게 좋습니다). 이것이 보장됩니까, 아니면 그것에 의존해서는 안됩니까?


BroadcastReceiver.onReceive는 항상 UI 스레드에서 실행됩니까?

예.


수신자를 동적으로 등록하므로 UI ​​스레드 이외의 다른 스레드가를 처리하도록 지정할 수 있습니다 onReceive(). 이것은 registerReceiver () 의 Handler 매개 변수를 통해 수행됩니다 .

즉, 다른 핸들러를 지정하지 않으면 항상 UI 스레드에서 처리됩니다.


BroadcastReceiver.onReceive는 항상 UI 스레드에서 실행됩니까?

일반적으로 등록 방법에 따라 다릅니다.

BroadcastReceiver사용 을 등록한 경우 :

registerReceiver(BroadcastReceiver receiver, IntentFilter filter)

메인 액티비티 스레드 (일명 UI 스레드) 에서 실행됩니다 .

다른 스레드에서BroadcastReceiver 유효한 Handler 실행을 사용하여 등록하는 경우 :

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

그것은 당신의 맥락에서 실행됩니다 Handler

예를 들면 다음과 같습니다.

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

자세한 내용은 여기여기 .


이전 답변이 올바르게 언급 된 것처럼 onReceive스레드에서 실행되며 그 풍미가 registerReceiver()핸들러를 수락 하면 등록됩니다 . 그렇지 않으면 기본 스레드에서.

수신기가 등록되어있는 경우를 제외 LocalBroadcastManager하고 방송을 통해입니다 sendBroadcastSync- 그것은 어디 분명히 스레드에서 실행하는 호출sendBroadcastSync.


예 Context.registerReceiver (BroadcastReceiver 수신자, IntentFilter 필터, String broadcastPermission, 핸들러 스케줄러)

참고 URL : https://stackoverflow.com/questions/5674518/does-broadcastreceiver-onreceive-always-run-in-the-ui-thread

반응형