Подтвердить что ты не робот

Когда нужно отменить регистрацию BroadcastReceiver? В onPause(), onDestroy() или onStop()?

Когда следует использовать unregisterReceiver? В onPause(), onDestroy() или onStop()?

Примечание. Мне нужно, чтобы служба выполнялась в фоновом режиме.

Update:

  • Я получаю исключения, освобождающие приемники null.

  • Активность просочилась в приемники намерений, если вам не нужен вызов unregisterReceiver();

Скажите, пожалуйста, если что-то не так, вот мой код:

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

}
4b9b3361

Ответ 1

это зависит от того, где вы зарегистрировали приемник. Параллельные пары методов

onCreate - onDestroy
onResume - onPause
onStart  - onStop

если вы зарегистрируете приемник в первом, затем отмените его в методе завершения.

Ответ 2

Из Документация для Android:

Вы должны реализовать onStop(), чтобы освободить ресурсы активности, такие как сетевое подключение или отменить регистрацию широковещательных приемников.

Затем я буду следовать за этими парами (используя аналогию @StinePike):

onResume - onPause
onStart  - onStop

Из-за Android Lifecycle, и как @w3bshark упомянул:

В устройствах post-HoneyComb (3.0+) onStop() является последним гарантированным обработчиком.

Ответ 3

Широковещательный приемник является невидимым компонентом. Все это реагирует на какое-то изменение через обратный вызов onReceive().

Таким образом, имеет смысл активировать их, только когда ваша активность находится в состоянии реагирования или когда она становится Enabled/active - которая вызывается при вызове функции onResume().

Итак, лучше зарегистрироваться в onResume() - Когда активность видна и включена и отменена в onStop(), когда активность больше не активна.

Ответ 4

Это так же просто, если вы хотите прослушивать события, даже если ваша активность не видна, а затем отмените регистрацию в onStop() (Например, из Activity A вы открываете действие B, но если вы хотите, чтобы A все еще слушал события).

Но когда вы хотите слушать только события, когда ваша активность видна, а затем в onPause call unregister() (Например, из Activity A вы открыли Activity B, но теперь вы не хотите слушать события в действии A).

Надеюсь, это поможет вашей проблеме.