Activiteit heeft IntentReceiver gelekt dat oorspronkelijk hier was geregistreerd. Mist u een oproep om deReceiver() ongedaan te maken?

Wat is de oorzaak van de bovenstaande fout?
Hoe kan het worden vermeden?


Antwoord 1, autoriteit 100%

Vertrouw niet op onStop(), omdat:

Houd er rekening mee dat deze methode nooit mag worden aangeroepen, in situaties met weinig geheugen waarin het systeem niet genoeg geheugen heeft om het proces van uw activiteit draaiende te houden nadat de methode onPause() is aangeroepen

Meer over de levenscyclus van activiteiten hier.

Afmelden van uw ontvanger in onPause():

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

Antwoord 2, autoriteit 79%

U moet uw ontvangers afmelden bij het stoppen van uw activiteit:

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

Antwoord 3, autoriteit 13%

U kunt unregisterzodra u de broadcastreceiver

heeft ontvangen

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

Antwoord 4, autoriteit 7%

Om aan de bovenstaande antwoorden toe te voegen: als u een ontvanger registreert in onCreate, moet deze worden afgemeld bij onDestroy. als u een ontvanger registreert op onResume, moet u deze afmelden in onPause.

Houd er rekening mee waar u de ontvanger aan- en afmeldt. Als u bijvoorbeeld een ontvanger registreert in onCreate(Bundle) met behulp van de activiteitscontext, moet u de registratie ongedaan maken in onDestroy() om te voorkomen dat de ontvanger uit de activiteitscontext wordt gelekt . Als u een ontvanger registreert in onResume(), moet u de registratie ongedaan maken in onPause() om te voorkomen dat deze meerdere keren wordt geregistreerd (als u geen uitzendingen wilt ontvangen wanneer deze is gepauzeerd, en dit kan onnodige systeemoverhead verminderen). Maak de registratie niet ongedaan in onSaveInstanceState(Bundle), omdat dit niet wordt aangeroepen als de gebruiker teruggaat in de geschiedenisstapel.

Bron


Antwoord 5, autoriteit 3%

Het afmelden van uw ontvanger op onStop() is het geldige antwoord. Roep het niet aan volgens de methode onPause().

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

Antwoord 6, autoriteit 3%

Zorg ervoor dat de ontvanger is geregistreerd voordat u de registratie ongedaan maakt. om dit te doen, declareer een boolean

private boolean isReceiverRegistered = false;

stel vervolgens direct na het aanroepen van de registerReceiver()-methode de vlag isReceiverRegisteredin op true zoals weergegeven in het onderstaande codefragment

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

vervolgens, in onPause()

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

Other episodes