java - Android IntentReceiver 泄露

标签 java android

在我的 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/

相关文章:

java - 将不同 swing 组件的类实例添加到 JPanel

java - 如果套接字必须已经绑定(bind)到它,为什么 DatagramSocketImpl joinGroup 方法需要一个 NetworkInterface?

android - 找不到 DatabaseObjectNotClosedException 错误的来源

java - 可以访问Android智能手 secret 钥库吗?

java - 多节点 hadoop 集群中的 Apache Spark Sql 问题

java - Java 中的执行关闭会带来一些麻烦

java - 每个请求的上下文路径都可以改变吗?

android - Webview + CSS3 无法在较小的屏幕上正确缩放图像

java - 带有 ClickListener 的搜索栏到搜索到的 DetailActivity 不起作用

android - 在 Firebase Analytics 上看不到 UTM 安装