Are Android's BroadcastReceivers started in a new thread?

前端 未结 5 1311
难免孤独
难免孤独 2020-12-05 00:01

If I have an inner class that extends BroadcastReceiver within my Service class, should I care about synchronization, when the BroadcastRecei

5条回答
  •  一整个雨季
    2020-12-05 00:38

    Android Broadcast receivers are by default start in GUI thread (main thread) if you use RegisterReceiver(broadcastReceiver, intentFilter).

    But it can be run in a worker thread as follows;

    When using a HandlerThread, be sure to exit the thread after unregistering the BroadcastReceiver. If not, File Descriptor (FD) leaks occur in Linux level and finally the application gets crashed if continue to Register / Unregister.

    unregisterReceiver(...);

    Then looper.quit(); Or looper.quitSafely();

    private Handler broadcastReceiverHandler = null;
    private HandlerThread broadcastReceiverThread = null;
    private Looper broadcastReceiverThreadLooper = null;
    
    private BroadcastReceiver broadcastReceiverReadScans = new BroadcastReceiver() {
        @Override
        public void onReceive(Context context, Intent intent) {
    
        }
    }
    
    private void registerForIntents() {
        broadcastReceiverThread = new HandlerThread("THREAD_NAME");//Create a thread for BroadcastReceiver
        broadcastReceiverThread.start();
    
        broadcastReceiverThreadLooper = broadcastReceiverThread.getLooper();
        broadcastReceiverHandler = new Handler(broadcastReceiverThreadLooper);
    
        IntentFilter filterScanReads = new IntentFilter();
        filterScanReads.addAction("ACTION_SCAN_READ");
        filterScanReads.addCategory("CATEGORY_SCAN");
    
        context.registerReceiver(broadcastReceiverReadScans, filterScanReads, null, broadcastReceiverHandler);
    }
    
    private void unregisterIntents() {
        context.unregisterReceiver(broadcastReceiverReadScans);
        broadcastReceiverThreadLooper.quit();//Don't forget
    }
    

提交回复
热议问题