在我的 Android 应用程序中,我有一个 Activity MainActivity,它有一个 Fragment MainFragment,它启动 IntentService,然后转换到 Activity SelectPlayersActivity(它有一个 Fragment SelectPlayersFragment)。当任一 Activity 位于前台时,IntentService 可能会完成。所以我必须在它们的两个 fragment 中注册广播接收器。我通过在名为“NewGameServiceReceiver”的两个 fragment 中创建扩展 BroadcastReceiver 的子类来实现此目的。在这两个 fragment 中,我按如下方式注册 BroadcastReiceiver:
private void registerBroadcastReceivers() {
IntentFilter newGameFilter = new IntentFilter(BroadcastReceivers.NEW_GAME_BROADCAST_RECEIVER.getName());
newGameServiceReceiver = new NewGameServiceReceiver();
getActivity().registerReceiver(newGameServiceReceiver, newGameFilter);
}
这是在两个 fragment 的 onStart() 方法中触发的:
@Override
public void onStart() {
super.onStart();
registerBroadcastReceivers();
}
我取消注册的两个 fragment 如下:
@Override
public void onPause() {
super.onPause();
getActivity().unregisterReceiver(newGameServiceReceiver);
}
但是,当我最终转换到第三个 Activity 时,DDMS 报告 NewGameServiceReceiver 上存在内存泄漏。 unregisterReceiver() 方法在应该的时候被调用。
07-31 00:01:30.017: E/ActivityThread(2002): Activity
ws.hamacher.cluebuddy.SelectPlayersActivity has leaked IntentReceiver
ws.hamacher.cluebuddy.SelectPlayersFragment$NewGameServiceReceiver@b3822ea0
that was originally registered here. Are you missing a call to
unregisterReceiver()? 07-31 00:01:30.017: E/ActivityThread(2002):
android.app.IntentReceiverLeaked: Activity
ws.hamacher.cluebuddy.SelectPlayersActivity has leaked IntentReceiver
ws.hamacher.cluebuddy.SelectPlayersFragment$NewGameServiceReceiver@b3822ea0
that was originally registered here. Are you missing a call to
unregisterReceiver()?
这是声明和处理 BroadcastReceviers
的正确方法吗?请注意,我已为两个 fragment 中的 IntentFilters
赋予相同的构造函数参数 (BroadcastReceivers.NEW_GAME_BROADCAST_RECEIVER.getName())
。这是必要的,因为我不知道哪个 Fragment 将接收服务的 Intent。
感谢任何评论/帮助。
最佳答案
首先尝试取消注册接收器,然后调用 super.onPause()
@Override
public void onPause() {
getActivity().unregisterReceiver(newGameServiceReceiver);
super.onPause();
}
希望这有帮助。
关于java - Android IntentReceiver 泄露,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17960289/