2011-03-22 38 views
33

如果我在Service類中有一個擴展BroadcastReceiver的內部類,那麼當BroadcastReceiver類讀取/寫入Service類中的對象時,我應該關心同步嗎? 或者換一種說法:是BroadacstReceiveronReceive()方法是在一個額外的線程中啓動的嗎?Android的BroadcastReceivers是否在新線程中啓動?

回答

36

的的onReceive()方法始終調用主線程(也稱爲「UI線程」),除非你要求它被使用的registerReceiver()變種不同的線程調度:

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

LocalBroadcastManager呢?爲什麼沒有這種方法? – JohnyTex 2017-02-13 13:02:18

17

The onReceive() method is called on the main thread.因此,如果您對服務類的所有訪問都是在主線程中完成的,則不需要任何同步。

+4

所以他的問題的答案是否定的! 'onReceive'方法不會在一個額外的線程上運行。 – 2011-03-22 20:14:43

+0

Android手冊: 請注意,BroadcastReceiver運行在意圖被廣播的同一線程上;在我們的例子中,這是主/ GUI線程! – JohnyTex 2014-10-02 09:05:31

+0

@Stephan,在'onReceive'中的* Toast.makeText(.. data)*的操作,其中* data *從服務中的後臺線程傳遞是線程安全的? – 2016-09-08 11:31:20

18

Android的BroadcastReceivers是否在新線程中啓動?

通常,這一切都取決於您如何註冊它。

如果您BroadcastReceiver使用註冊:

registerReceiver(BroadcastReceiver receiver, IntentFilter filter) 

它將在主要活動的線程中運行(也稱爲UI線程)

如果您使用的是有效Handler在不同的線程上運行註冊BroadcastReceiver

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 

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

它會在你的Handler

上下文例如運行

Det ails here & here

+0

Caner。因此,在'onReceive'中的* Toast.makeText(.. data)*的操作,其中* data *從服務中的後臺線程傳遞是線程安全的? – 2016-09-08 11:32:41

2

此外,您可以在AndroidManifest.xml中指定「android:process」接收器元素屬性。見here。這樣你可以指定接收者作爲一個單獨的進程運行,而不是綁定到主UI線程。

相關問題