Activity已泄露最初在此处注册的IntentReceiver.你是否错过了对unregisterReceiver()的调用?

Raj*_*Raj 62 android

01-16 16:52:42.211: E/ActivityThread(2529): Activity com.Civilcourage.CivilcurageSplash has leaked IntentReceiver com.google.android.gcm.GCMBroadcastReceiver@405282e0 that was originally registered here. 

Are you missing a call to unregisterReceiver()?
Run Code Online (Sandbox Code Playgroud)

上述错误的原因是什么?怎么可以避免?

Mel*_*des 52

不要依赖onStop(),因为:

请注意,在低内存情况下,系统没有足够的内存来保持活动进程在调用onPause()方法后运行

更多关于活动生命周期的信息.

在onPause()中取消注册您的接收器:

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

    unregisterReceiver(yourReceiver);
}
Run Code Online (Sandbox Code Playgroud)

  • @MobileMon,使用onResume()和onPause()来注册/取消注册接收者.onDestroy()可能并不总是被调用,与onStop()相同.请看SnowyTracks的一个很好的解释:http://stackoverflow.com/questions/7887169/android-when-to-register-unregister-broadcast-receivers-created-in-an-activity (5认同)

Ner*_*een 46

您需要在停止活动时取消注册接收器:

@Override
protected void onStop()
{
    unregisterReceiver(yourReceiver);
    super.onStop();
}
Run Code Online (Sandbox Code Playgroud)


Omi*_*iva 5

您可以unregister尽快收到broadcastreceiver

 @Override
 public void onReceive(Context context, Intent intent) {
     getActivity().unregisterReceiver(this);
 }
Run Code Online (Sandbox Code Playgroud)

  • 除非我们有此要求,否则不会在收到不良设计后立即注销 (3认同)
  • 是的,除非一次收到,否则不确定为什么要这样做。通常我将BroadcastReceivers设置为连续消息 (2认同)