在 activity 中的哪里调用 unregisterReceiver?

Where to call unregisterReceiver in an activity?

我最近一直在实现一个应用程序,我在其中注册一个接收器 class 然后取消注册作为我在 class 中做的最后一件事,然后再转到另一个 [=20] =].

然而,当我回到 activity 并再次初始化子 class 时,即使我知道调用了 unregisterReceiver(),我仍收到以下错误。

Activity has leaked IntentReceiver com.mycomp.devel.ControlActivity$BLERunnable@6bb9d96 that was originally registered here. Are you missing a call to unregisterReceiver()?

注销 是否必须 在 onPause() 或 onDestroy() 内才能有效工作,或者是否有其他东西阻碍?

通常建议onResume()onPause()来注册和注销接收器。

但是如果您在 onCreate() 中注册 BroadcastReceiver,则必须在 onDestroy() 中取消注册。并且有必要在 android 中注销广播接收器。

 @Override
public void onDestroy() {
unregisterReceiver(myReceiver);
super.onDestroy();
}

除此之外 onDestroy( 在某些情况下不会被调用,因此可能会导致泄漏。因此,首选方法是在 onResume() 中注册并在 onPause()onStart()/onStop() 中注销。如果这符合要求,您可以使用 onResume()/onPause()onStart()/onStop().

或者如果 registerReceiver 在 onCreate() 内,则在 onDestroy().

内注销接收器

这取决于您希望它如何工作。如果您希望接收器仅在 activity 位于前台时触发,请使用 onResume()/onPause().

如果您希望它在 activity 暂停时额外触发,请使用 onCreate()/onDestroy()

想一个用例。假设您的接收器在某些用户的数据更新时被调用,因此您需要重新加载它。如果您这样做 onResume()/onPause(),则需要重新加载 onResume() 中的用户数据,因为如果您的应用程序暂停时数据发生变化,您将不会收到蜜蜂通知。 OTOH,如果你在onCreate()注册,你只需要在onCreate()加载用户数据。

onCreate()/onPause() 的缺点可能是您的应用程序在暂停时正在更新它 UI,这可能是无缘无故的,因为用户永远不会回到该应用程序。

这只是想让您考虑什么最适合您,因为我不知道您的确切用例。