Android: L'exception di Leaked IntentReceiver viene gettata anche se chiamo unregisterReceiver

Non capisco perché ho questa exception quando premendo il tasto indietro. Ho l'IntentReceiver registrato nel metodo onCreate e si suppone che non sia registrato nel metodo onPause. La mia chiamata Log.w () all'interno del metodo onPause mi port a credere che sia chiamato il metodo unregisterReceiver (), ma ho ancora questa exception.

qualche idea?

  • Come recuperare un context da una class non attività?
  • Come aggiornare l'attività dopo aver modificato la lingua (Locale) all'interno dell'applicazione
  • Utilizzando onSaveInstanceState con frammenti in backstack?
  • Affrontare diverse risoluzioni per il gioco Android basato su pixel
  • Widget non aggiornato al riavvio del lancio
  • Come fermare l'attacco hack / DOS sull'API web
  • private PlayerReceiver playerReceiver; public void onCreate(Bundle savedInstanceState) { ... IntentFilter playerFilter; playerReceiver = new PlayerReceiver(); playerFilter = new IntentFilter(PlayerService.BUFFERING_FAILURE); playerFilter.addAction(PlayerService.BUFFERING_SUCCESS); registerReceiver(playerReceiver, playerFilter); ... } protected void onPause() { ... if (playerReceiver != null){ unregisterReceiver(playerReceiver); Log.w(TAG, "playerReceiver has been unregistered"); playerReceiver = null; } ... } public class PlayerReceiver extends BroadcastReceiver { public void onReceive(Context context, Intent intent) { if (intent.getAction().equals(PlayerService.BUFFERING_FAILURE)){ setListenButton(false); } closePlayDialog(); } } 

    Uscita LogCat

     08-26 11:44:28.646: WARN/WWOZMain(1058): playerReceiver has been unregistered 08-26 11:44:29.476: ERROR/ActivityThread(1058): Activity org.wwoz.WWOZMain has leaked IntentReceiver org.wwoz.WWOZMain$PlayerReceiver@43e4dd60 that was originally registered here. Are you missing a call to unregisterReceiver()? 08-26 11:44:29.476: ERROR/ActivityThread(1058): android.app.IntentReceiverLeaked: Activity org.wwoz.WWOZMain has leaked IntentReceiver org.wwoz.WWOZMain$PlayerReceiver@43e4dd60 that was original 

    qui registrati. Stai mancando una chiamata per annullare il registroReceiver ()?

  • GoogleAnalyticsTracker javadoc
  • Il modo migliore per hide la tastiera in Android
  • Purtroppo <application> si è arrestato
  • Fuori memory in un'assegnazione di byte (bitmap come String al webservice usando il soap)
  • Utilizzo delle risorse di layout in un LiveWallpaper su Android
  • RecyclerView gli oggetti con grande spazio vuoto dopo 23.2.0
  • 3 Solutions collect form web for “Android: L'exception di Leaked IntentReceiver viene gettata anche se chiamo unregisterReceiver”

    Questo è un problema di ciclo di vita di attività Android. Lo vedo in un'attività principale e poi testare sul dispositivo con il button di schiena che torna a una schermata di spruzzatura.

    Nel metodo onPause() .

    Annullare la logging di BroadcastReceiver che hai creato in onCreate()

    onRestart() un nuovo ricevitore radiotelevisivo.

    Nella class attività è necessario mantenere un record del destinatario Broadcast come membro di dati di istanza.

    SECONDO

    Penso che questo sia anche un problema di miglioramento delle funzionalità con Android.

    A volte un sviluppatore ha bisogno di un ricevitore di broadcast per sopravvivere all'attività. Ad esempio per capire quando determinati stati dello schermo sono disponibili o less. Pensate a un context di conversazione del model di stream di lavoro, che ha molti stati.

    TERZO

    È ansible registrare e distriggersre i ricevitori di trasmissione con un'attività, ma una semplice chiamata come isRegistered(BroadcastReceiver) nella class Attività potrebbe essere molto utile.

    Se hai bisogno di ricevitori per vivere oltre l'attività, non onDestroy() la risposta, tranne che per annullare l'avviso, aggiungendo l' onDestroy() unregister(X) nella chiamata onDestroy() . YMMV 😉

    Ho avuto lo stesso problema. La causa era che avevo inavvertitamente registrato lo stesso BroadcastReceiver due volte.

    La mia situazione era simile a Mullins, ho registrato un ricevitore sia in una class che nella sua sottoclass.

    Per i neofiti come me, basta cambiare un punto di interruzione al receiver , quindi eseguire il debug della tua applicazione. Se il ricevitore è qualcosa di simile a com.example.main.listener.MyRecevier@421c0100 , mentre il log degli errori in logcat è diverso da quello, ad esempio com.example.main.listener.MyRecevier@4202fb40 , con caratteri dopo "@" diverso , sicuramente lo hai registrato due volte (o più).

    (Sopra gradisce un commento sotto la risposta di Mullins, in realtà, lo inserisco qui perché non posso pubblicare commenti adesso.)

    L'Android è un fan Android di Google, tutto su telefoni Android, Android Wear, Android Dev e applicazioni Android Games e così via.