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

В результате произошла утечка IntentReceiver, которая была первоначально зарегистрирована здесь. Вам не хватает вызова unregisterReceiver()?

01-16 16:52:42.211: E/ActivityThread(2529): Activity com.Civilcourage.CivilcurageSplash has leaked IntentReceiver [email protected] that was originally registered here. 

Are you missing a call to unregisterReceiver()?

В чем причина вышеуказанной ошибки? Как его можно избежать?

4b9b3361

Ответ 1

Не полагайтесь onStop(), потому что:

Обратите внимание, что этот метод никогда не может быть вызван в ситуациях с низкой памятью, когда в системе недостаточно памяти, чтобы поддерживать ваш процесс активности после того, как его метод onPause() называется

Подробнее о жизненном цикле деятельности здесь.

Отмените регистрацию своего приемника в onPause():

@Override
protected void onPause() {
    super.onPause();

    unregisterReceiver(yourReceiver);
}

Ответ 2

Вам необходимо отменить регистрацию получателей при остановке вашей деятельности:

@Override
protected void onStop()
{
    unregisterReceiver(yourReceiver);
    super.onStop();
}

Ответ 3

Вы можете unregister как только получите broadcastreceiver

 @Override
 public void onReceive(Context context, Intent intent) {
     getActivity().unregisterReceiver(this);
 }

Ответ 4

Просто добавьте к ответам выше, если вы зарегистрируете получателя в onCreate, он должен быть незарегистрирован в onDestroy. если вы регистрируете получателя на onResume, вы должны отменить его регистрацию в onPause.

Помните, где вы регистрируете и отменяете регистрацию получателя, например, если вы регистрируете получателя в onCreate (Bundle) с использованием контекста активности, вы должны отменить его регистрацию в onDestroy(), чтобы предотвратить утечку получателя из контекста активности. Если вы регистрируете получателя в onResume(), вы должны отменить его регистрацию в onPause(), чтобы предотвратить его многократную регистрацию (если вы не хотите получать широковещательные сообщения во время паузы, и это может сократить ненужные системные издержки). Не отменяйте регистрацию в onSaveInstanceState (Bundle), потому что это не вызывается, если пользователь возвращается в стек истории.

Источник

Ответ 5

Отменить регистрацию вашего приемника на onStop() является действительным ответом. Не называть его onPause() методом.

@Override
protected void onStop()
{
    unregisterReceiver(yourReceiverName);
    super.onStop();
}

Ответ 6

Убедитесь, что получатель зарегистрирован, прежде чем отменить его регистрацию. сделать это, объявить логическое значение

private boolean isReceiverRegistered = false;

затем сразу после вызова метода registerReceiver() установите для флага isReceiverRegistered значение true, как показано в приведенном ниже фрагменте кода

registerReceiver(broadcastReceiver, new IntentFilter("anyString"));
    isReceiverRegistered = true;

затем в onPause()

 @Override
protected void onPause() {
    super.onPause();
    if(isReceiverRegistered){
        unregisterReceiver(broadcastReceiver);
        isReceiverRegistered = false;// set it back to false.
    }
}