[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 스케줄러)