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

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



답변

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

예.


답변

수신자를 동적으로 등록하기 때문에 다른 스레드 (UI 스레드 제외)가 onReceive(). 이는 registerReceiver () 의 Handler 매개 변수를 통해 수행됩니다 .

즉, 다른 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.


답변

YES Context.registerReceiver (BroadcastReceiver 수신기, IntentFilter 필터, String broadcastPermission, Handler 스케줄러)


답변