Java Android IntentReceiver泄漏
在我的Android应用程序中,我有一个Activity MainActivity,它有一个Fragment MainFragment,启动一个IntentService,然后转换到Activity SelectPlayerActivity(它有一个Fragment SelectPlayerFragment)。当任一活动位于前台时,IntentService可能会完成。所以我必须在两个片段中注册广播接收器。为此,我在两个名为“NewGameServiceReceiver”的片段中创建了扩展BroadcastReceiver的子类。在这两个片段中,我注册了BroadcastReeiver,如下所示:Java Android IntentReceiver泄漏,java,android,Java,Android,在我的Android应用程序中,我有一个Activity MainActivity,它有一个Fragment MainFragment,启动一个IntentService,然后转换到Activity SelectPlayerActivity(它有一个Fragment SelectPlayerFragment)。当任一活动位于前台时,IntentService可能会完成。所以我必须在两个片段中注册广播接收器。为此,我在两个名为“NewGameServiceReceiver”的片段中创建了扩展Bro
private void registerBroadcastReceivers() {
IntentFilter newGameFilter = new IntentFilter(BroadcastReceivers.NEW_GAME_BROADCAST_RECEIVER.getName());
newGameServiceReceiver = new NewGameServiceReceiver();
getActivity().registerReceiver(newGameServiceReceiver, newGameFilter);
}
@Override
public void onPause() {
super.onPause();
getActivity().unregisterReceiver(newGameServiceReceiver);
}
这在两个片段的onStart()方法中都会触发:
@Override
public void onStart() {
super.onStart();
registerBroadcastReceivers();
}
我按如下方式注销这两个片段:
private void registerBroadcastReceivers() {
IntentFilter newGameFilter = new IntentFilter(BroadcastReceivers.NEW_GAME_BROADCAST_RECEIVER.getName());
newGameServiceReceiver = new NewGameServiceReceiver();
getActivity().registerReceiver(newGameServiceReceiver, newGameFilter);
}
@Override
public void onPause() {
super.onPause();
getActivity().unregisterReceiver(newGameServiceReceiver);
}
然而,当我最终切换到第三个活动时,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()?
这是声明和处理广播接收者的正确方法吗?请注意,我在两个片段中为IntentFilters
提供了相同的构造函数参数(BroadcastReceivers.NEW\u GAME\u BROADCAST\u RECEIVER.getName())
。这是必要的,因为我不知道哪个片段将接收服务的意图
欢迎提供任何意见/帮助。请尝试先取消注册接收者,然后调用super.onPause()
希望这有帮助