【问题标题】:Android IntentReceiver leakingAndroid IntentReceiver 泄漏
【发布时间】:2013-09-02 16:53:34
【问题描述】:

在我的 Android 应用程序中,我有一个 Activity MainActivity,它有一个 Fragment MainFragment,它启动一个 IntentService,然后转换到 Activity SelectPlayersActivity(它有一个 Fragment SelectPlayersFragment)。当任一 Activity 处于前台时,IntentService 可能会完成。所以我必须在它们的两个片段中注册广播接收器。我通过在两个名为“NewGameServiceReceiver”的片段中创建扩展 BroadcastReceiver 的子类来做到这一点。在这两个片段中,我按如下方式注册了 BroadcastReiceiver:

private void registerBroadcastReceivers() {
    IntentFilter newGameFilter = new IntentFilter(BroadcastReceivers.NEW_GAME_BROADCAST_RECEIVER.getName());
    newGameServiceReceiver = new NewGameServiceReceiver();
    getActivity().registerReceiver(newGameServiceReceiver, newGameFilter);

}

这在两个片段的 onStart() 方法中触发:

@Override
public void onStart() {
    super.onStart();
    registerBroadcastReceivers();
}

我注销的两个片段如下:

@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 的正确方法吗?请注意,我在两个片段中都给了IntentFilters 相同的构造函数参数(BroadcastReceivers.NEW_GAME_BROADCAST_RECEIVER.getName())。这是必要的,因为我不知道哪个 Fragment 会收到服务的 Intent。

感谢任何 cmets/帮助。

【问题讨论】:

    标签: java android


    【解决方案1】:

    尝试先注销接收方,然后调用super.onPause()

    @Override
    public void onPause() {
        getActivity().unregisterReceiver(newGameServiceReceiver);
        super.onPause();
    
    }
    

    希望这会有所帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-04
      • 2021-04-06
      • 1970-01-01
      • 2012-04-04
      • 2012-07-03
      相关资源
      最近更新 更多