片段中的哪个位置我应该取消注册BroadcastReceiver?

时间:2015-03-27 07:38:54

标签: android android-fragments broadcastreceiver

我有一个带有ListView和一个BroadcastReceiver的Fragment,它会在新数据到达时更新ListView。 Fragments生命由ViewPager控制。

关于在哪里(联合国)注册BroadcastReceiver,我发现several places建议在

中执行此操作

onResume()

refreshReceiver = new RefreshReceiver();
LocalBroadcastManager.getInstance(getActivity()).registerReceiver(
        refreshReceiver,
        refreshIntentFilter);

onPause()

LocalBroadcastManager.getInstance(getActivity()).unregisterReceiver(refreshReceiver);

但是,这不能正常工作。当我长按主页按钮进入最近的应用程序屏幕时,会调用onPause()。当我在最近的应用上时出现新信息时,ListView错过了更新并在我返回后显示旧信息。

现在我正考虑将取消注册移动到onStop()方法(甚至在onDestroy()中),但是当片段被销毁时,是否可以保证调用?我很担心,因为如果BroadcastManager持有对BroadcastReceiver的引用,并且反过来持有对Fragment的引用,那将是一个非常严重的内存泄漏。

2 个答案:

答案 0 :(得分:0)

如果您不需要接收器,请取消注册。如果您只在该片段中使用它,您可以考虑在ViewDestroyed()上取消注册它。

答案 1 :(得分:0)

根据this answer,如果您的片段是单个而不是寻呼机,您可以取消/注册LBM:

Content-Length: 0

否则,您需要找出@Override public void onResume() { super.onResume(); LocalBroadcastManager.getInstance(getActivity()).registerReceiver( broadcast_manager, new IntentFilter("filter")); } @Override public void onPause() { super.onPause(); LocalBroadcastManager.getInstance(getActivity()).unregisterReceiver(broadcast_manager); } 何时可见,然后注册LBM。

通过这个:

fragment

您可以在片段

中注册LBM