Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/204.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Android IntentReceiver泄漏_Java_Android - Fatal编程技术网

Java Android IntentReceiver泄漏

Java Android IntentReceiver泄漏,java,android,Java,Android,在我的Android应用程序中,我有一个Activity MainActivity,它有一个Fragment MainFragment,启动一个IntentService,然后转换到Activity SelectPlayerActivity(它有一个Fragment SelectPlayerFragment)。当任一活动位于前台时,IntentService可能会完成。所以我必须在两个片段中注册广播接收器。为此,我在两个名为“NewGameServiceReceiver”的片段中创建了扩展Bro

在我的Android应用程序中,我有一个Activity MainActivity,它有一个Fragment MainFragment,启动一个IntentService,然后转换到Activity SelectPlayerActivity(它有一个Fragment SelectPlayerFragment)。当任一活动位于前台时,IntentService可能会完成。所以我必须在两个片段中注册广播接收器。为此,我在两个名为“NewGameServiceReceiver”的片段中创建了扩展BroadcastReceiver的子类。在这两个片段中,我注册了BroadcastReeiver,如下所示:

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()

希望这有帮助