Muhammad Muhammad - 4 months ago 69
Android Question

When to unregister BroadcastReceiver? In onPause(), onDestroy(), or onStop()?

When should I use unregisterReceiver? In

onPause()
,
onDestroy()
, or
onStop()
?

Note: I need the service to run in the background.

Update:


  1. I get an exception releasing receivers
    null
    .

  2. Activity has leaked intent receivers are you missing call to
    unregisterReceiver();



Please tell me if there's something wrong, here's my code:

private boolean processedObstacleReceiverStarted;
private boolean mainNotificationReceiverStarted;

protected void onResume() {

super.onResume();
try {
registerReceivers();

} catch (Exception e) {

Log.e(MatabbatManager.TAG,
"MAINActivity: could not register receiver for Matanbbat Action "
+ e.getMessage());
}
}

private void registerReceivers() {

if (!mainNotificationReceiverStarted) {
mainNotificationReceiver = new MainNotificationReceiver();

IntentFilter notificationIntent = new IntentFilter();

notificationIntent
.addAction(MatabbatManager.MATABAT_LOCATION_ACTION);
notificationIntent
.addAction(MatabbatManager.MATABAT_New_DATA_RECEIVED);
notificationIntent
.addAction(MatabbatManager.STATUS_NOTIFCATION_ACTION);
registerReceiver(mainNotificationReceiver, notificationIntent);

mainNotificationReceiverStarted = true;

}

if (!processedObstacleReceiverStarted) {
processedObstacleReceiver = new ProcessedObstacleReceiver();
registerReceiver(processedObstacleReceiver, new IntentFilter(
MatabbatManager.MATABAT_ALARM_LOCATION_ACTION));
processedObstacleReceiverStarted = true;

}

}

private void unRegisterReceivers() {

if (mainNotificationReceiverStarted) {
unregisterReceiver(mainNotificationReceiver);
mainNotificationReceiverStarted = false;
}
if (processedObstacleReceiverStarted) {
unregisterReceiver(processedObstacleReceiver);
processedObstacleReceiverStarted = false;
}

}


@Override
protected void onDestroy() {
// TODO Auto-generated method stub
super.onDestroy();

try {

unRegisterReceivers();
mWakeLock.release();//keep screen on
} catch (Exception e) {
Log.e(MatabbatManager.TAG, getClass() + " Releasing receivers-" + e.getMessage());
}

}

Answer

it depends on where you have register the receiver. The complementary method pairs are

onCreate - onDestroy
onResume - onPause
onStart  - onStop

if you register the receiver in the first one then unregister it in it's ending method.

Comments