我最近一直在实现一个应用程序,我在子类中注册一个接收器,然后在我移动到另一个活动之前取消注册作为我在类内部做的最后一件事。
但是,当我回到活动并再次初始化子类时,即使我知道调用了unregisterReceiver(),我也会收到以下错误。
Activity has leaked IntentReceiver com.mycomp.devel.ControlActivity$BLERunnable$1@6bb9d96 that was originally registered here. Are you missing a call to unregisterReceiver()?
取消注册是否在onPause()或onDestroy()中才能有效地工作或者是否会有其他阻碍?
答案 0 :(得分:0)
通常建议onResume()
和onPause()
注册和取消注册接收方。
但是如果您在BroadcastReceiver
内注册onCreate()
,则必须在onDestroy()
中取消注册。并且有必要在android中取消注册广播接收器。
@Override
public void onDestroy() {
unregisterReceiver(myReceiver);
super.onDestroy();
}
除了onDestroy(
之外,在某些情况下不会被调用,因此可能会导致泄漏。首选方式是在onResume()
中注册并在onPause()
或onStart()/onStop()
中取消注册。如果符合要求,您可以使用onResume()/onPause()
或onStart()/onStop()
。
或者如果registerReceiver在onCreate()
内,则取消注册onDestroy()
内的接收者。
答案 1 :(得分:0)
这取决于您希望它如何工作。如果您希望仅在活动位于前台时触发接收器,请使用OutputStreamWriter
。
如果您希望在活动暂停时另外触发,请使用onResume()/onPause()
。
想一个用例。假设在某些用户的数据更新时调用了您的接收器,因此您需要重新加载它。如果您执行了onCreate()/onDestroy()
,则需要在onResume()/onPause()
中重新加载用户数据,因为如果在您的应用暂停时更改了用户数据,则不会通知您。 OTOH,如果您在onResume()
注册,则只需在onCreate()
中加载用户数据。
onCreate()
的缺点可能是你的应用在暂停时会更新它的用户界面,可能没有任何理由,因为用户永远不会回到应用程序。
这只是试图让你考虑什么是最适合你的,因为我不知道你确切的用例。