如果我在Service
類中有一個擴展BroadcastReceiver
的內部類,那麼當BroadcastReceiver
類讀取/寫入Service
類中的對象時,我應該關心同步嗎? 或者換一種說法:是BroadacstReceiver
的onReceive()
方法是在一個額外的線程中啓動的嗎?Android的BroadcastReceivers是否在新線程中啓動?
回答
的的onReceive()方法始終調用主線程(也稱爲「UI線程」),除非你要求它被使用的registerReceiver()變種不同的線程調度:
Context.registerReceiver(BroadcastReceiver receiver,
IntentFilter filter,
String broadcastPermission,
Handler scheduler)
The onReceive() method is called on the main thread.因此,如果您對服務類的所有訪問都是在主線程中完成的,則不需要任何同步。
所以他的問題的答案是否定的! 'onReceive'方法不會在一個額外的線程上運行。 – 2011-03-22 20:14:43
Android手冊: 請注意,BroadcastReceiver運行在意圖被廣播的同一線程上;在我們的例子中,這是主/ GUI線程! – JohnyTex 2014-10-02 09:05:31
@Stephan,在'onReceive'中的* Toast.makeText(.. data)*的操作,其中* data *從服務中的後臺線程傳遞是線程安全的? – 2016-09-08 11:31:20
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
上下文例如運行
Caner。因此,在'onReceive'中的* Toast.makeText(.. data)*的操作,其中* data *從服務中的後臺線程傳遞是線程安全的? – 2016-09-08 11:32:41
此外,您可以在AndroidManifest.xml中指定「android:process」接收器元素屬性。見here。這樣你可以指定接收者作爲一個單獨的進程運行,而不是綁定到主UI線程。
- 1. Android:AlertDialog.show()是否啓動新的線程?
- 2. pthread_create是否啓動線程?
- 3. Android:重新啓動中斷線程onResume
- 4. 是否可以在新線程中啓動服務?
- 5. 在新線程中啓動課程
- 6. 在Android中啓動線程的問題
- 7. 從其活動啓動的服務是否在新線程中運行?
- 8. 「新線程」不啓動新線程?
- 9. Android線程:是否需要等待線程在「加入」之前啓動?
- 10. Task.Delay是否啓動一個新的線程?
- 11. 確定線程是否已啓動
- 12. Android服務的新線程錯誤:線程已啓動
- 13. 在servlet中啓動一個新線程
- 14. 在新線程中啓動方法
- 15. Android動態和靜態BroadcastReceivers
- 16. 我是否應該在本用例的新線程中啓動NSTimer
- 17. Android中的切換活動是否啓動新的JVM
- 18. 啓用/禁用BroadcastReceivers
- 19. handler.post(runnable)是否啓動一個新線程?
- 20. 如何在Android遊戲中重新啓動Java線程?
- 21. 線程不啓動,直到應用程序在Android上重新啓動
- 22. Android:線程無法啓動
- 23. Android:是在新流程還是當前流程中啓動的外部活動?
- 24. 重新啓動線程
- 25. 是否有可能在android中啓動應用程序的啓動事件?
- 26. Azure WebRole和Owin配置是否在獨立線程中啓動?
- 27. 如何在Android的新線程啓動服務
- 28. 在線程中啓動AsyncTask
- 29. 是否可以啓動(並停止)DLL中的線程?
- 30. 我是否需要boot_completed和startForeground啓動服務中的線程?
LocalBroadcastManager呢?爲什麼沒有這種方法? – JohnyTex 2017-02-13 13:02:18