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);