2

我有一个活动,有一个IntentFilter和BroadcastReceiver,我注册他们在我的onCreate()为什么我的活动泄漏?

IntentFilter filter = new IntentFilter(ACTION_RCV_MESSAGE); 
filter.addCategory(Intent.CATEGORY_DEFAULT); 
receiver = new MessageReceiver(); 
registerReceiver(receiver, filter); 

但在结束我的应用程序,logcat的说:

1月7日至3日:38:19.567:ERROR/ActivityThread(304):android.app.IntentReceiverLeaked:活动com.intentservicetest5.IntentServiceTest5Activity泄露了最初在此处注册的IntentReceiver co[email protected]44efe8a8。你是否错过了对unregisterReceiver()的调用?

但我有

public void onDestroy(Bundle savedInstanceState){ 
    unregisterReceiver(receiver); 
} 

为什么我的活动仍然漏水的时候我打电话unregisterReceiver()

+0

你是什么意思“结束你的应用程序”。 –

+1

@AlexLockwood我认为他的意思是“结束他的应用程序”d = – dcow

+1

我只是想知道他是否在调用Process.killProcess()或其他东西......听起来就像这样。 –

回答

4

Activity Lifecycle,您的应用程序是killable任何在大多数设备(低于Android 3.0/API级别12的任何设备)上的onPause()之后的时间以及在任何设备上的onStop()之后的任何时间。这意味着onDestroy()不保证被调用。在活动的最佳地点注册和注销的广播,那么,是onResume()onPause(),分别为:

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

    IntentFilter filter = new IntentFilter(ACTION_RCV_MESSAGE); 
    filter.addCategory(Intent.CATEGORY_DEFAULT); 
    receiver = new MessageReceiver(); 
    registerReceiver(receiver, filter); 
} 

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

    unregisterReceiver(receiver); 
} 

注意,作为@VipalShah指出的那样,你使用了错误的签名onDestroy()。这就是为什么unregisterReceiver()未被调用。使用@Override将帮助您解决这类问题。

另请注意,onPause()onResume()之间的对称性是故意的。如果您查看与上面链接的活动生命周期文章,您会看到onResume()在初始启动期间被调用,而不仅仅是从暂停恢复。所以你只需要在这里注册广播,而不是在onCreate()

最后,请注意,我使用了简单的代码。实际上,您可能需要在onCreate()中设置IntentFilter和MessageReceiver,然后在onResume()中调用registerReceiver()

更新:一个更重要的说明。按照Implementing the lifecycle callbacks

您的这些生命周期方法的实现必须始终在做任何工作之前调用超类实现。

这里很多人在方法结束时显示呼叫super.onWhatever()而不是在开始时。

+0

谢谢!感谢你们! –

+0

@Darshan使用FragmentActivity时,您无法做到防止泄漏广播接收器。 –

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

尝试在onPause()

1

的onDestroy并不总是保证被调用时,应用程序退出。您应该尝试取消注册onStoponPause

此外,请确保你打电话给你活动的父类方法在覆盖的方法:

@Override 
public void onPause() { 
    unregisterReceiver(receiver); 
    super.onPause(); 
} 
0

尝试使用此的onDestroy()

@Override 
protected void onDestroy() { 

    unregisterReceiver(receiver); 

    super.onDestroy(); 
}