Android registering BroadcastReceiver with registerReceiver

  • 2021-12-13 16:59:46
  • OfStack

android.context.ContextWrapper.registerReceiver


public Intent registerReceiver (BroadcastReceiver receiver, IntentFilter filter) 

Register a BroadcastReceiver to be run in the main activity thread. The receiver will be called with any broadcast Intent that matches filter, in the main application thread.

Parameters

receiver  The BroadcastReceiver to handle the broadcast.
filter  Selects the Intent broadcasts to be received.

Returns

The first sticky intent found that matches filter, or null if there are none.

Defining Variable 1


private SDStateMonitorReceiver sdStateReceiver; //SDcard Condition monitoring 
private LogTaskReceiver logTaskReceiver;

Defining Variable 2


private static String MONITOR_LOG_SIZE_ACTION = "MONITOR_LOG_SIZE";        // Log file monitoring action
private static String SWITCH_LOG_FILE_ACTION = "SWITCH_LOG_FILE_ACTION";    // Toggle log files action

Defining Variable 3


private final int SDCARD_TYPE = 0;            // The current log record type is stored in the SD Underneath the card 
private final int MEMORY_TYPE = 1;            // The current log record type is stored in memory 
private int CURR_LOG_TYPE = SDCARD_TYPE;    // Current log record type 

Defining Method register


private void register(){
    IntentFilter sdCarMonitorFilter = new IntentFilter();
    sdCarMonitorFilter.addAction(Intent.ACTION_MEDIA_MOUNTED);
    sdCarMonitorFilter.addAction(Intent.ACTION_MEDIA_UNMOUNTED);
    sdCarMonitorFilter.addDataScheme("file");
    sdStateReceiver = new SDStateMonitorReceiver();
    registerReceiver(sdStateReceiver, sdCarMonitorFilter);
    
    IntentFilter logTaskFilter = new IntentFilter();
    logTaskFilter.addAction(MONITOR_LOG_SIZE_ACTION);
    logTaskFilter.addAction(SWITCH_LOG_FILE_ACTION);
    logTaskReceiver = new LogTaskReceiver();
    registerReceiver(logTaskReceiver,logTaskFilter);
}

Define SDStateMonitorReceiver, a subclass of BroadcastReceiver


/**
 *  Monitoring SD Card status 
 */
class SDStateMonitorReceiver extends BroadcastReceiver{
    public void onReceive(Context context, Intent intent) {
        
        if(Intent.ACTION_MEDIA_UNMOUNTED.equals(intent.getAction())){    // Memory card unloaded 
            if(CURR_LOG_TYPE == SDCARD_TYPE){
                Log.d(TAG, "SDcar is UNMOUNTED");
                CURR_LOG_TYPE = MEMORY_TYPE;
                new LogCollectorThread().start();
            }
        }else{                                                            // Memory card is mounted 
            if(CURR_LOG_TYPE == MEMORY_TYPE){
                Log.d(TAG, "SDcar is MOUNTED");
                CURR_LOG_TYPE = SDCARD_TYPE;
                new LogCollectorThread().start();
                
            }
        }
    }
}

Define BroadcastReceiver subclass LogTaskReceiver


/**
 *  Log task receive 
 *  Switch logs and monitor log size 
 */
class LogTaskReceiver extends BroadcastReceiver{
    public void onReceive(Context context, Intent intent) {
        String action = intent.getAction();
        if(SWITCH_LOG_FILE_ACTION.equals(action)){
            new LogCollectorThread().start();
        }else if(MONITOR_LOG_SIZE_ACTION.equals(action)){
            checkLogSize();
        }
    }
}

The register method is called in the onCreate method.

Execute statements in onDestroy methods


unregisterReceiver(sdStateReceiver);
unregisterReceiver(logTaskReceiver);

Related articles: