【问题标题】:Keeping Fragments Broadcast Receivers active even when not in view即使不在视图中,也保持片段广播接收器处于活动状态
【发布时间】:2014-06-06 18:10:22
【问题描述】:

我有一个包含两个片段的活动,在给定时间仅显示两个片段中的一个,由用户确定。两个片段都通过广播接收器订阅数据。

acitivty 使用片段管理器的 replace() 方法管理显示哪个片段,例如

getFragmentManager().beginTransaction().replace(R.id.north_fragment, fragment1, FRAGMENT_TAG).commit();

广播接收器在 Fragment 的 onCreateView() 覆盖中注册:广播接收器按预期接收适当的数据。

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
        Bundle savedInstanceState) {
    View rootView = inflater.inflate(R.layout.fragment_spectrum_analyzer_graph, container, false);

    setupGraphView(rootView);

    // register for Spectrum Frame Response messages
    myReceiver = new BroadcastReceiver() {

        @Override
        public void onReceive(Context context, Intent intent) {
            Log.d(TAG, "onReceive()");
            // do stuff
    }
}

广播接收器在 onDestroyView() 中未注册,例如:

@Override
public void onDestroyView() {
    super.onDestroyView();
    getActivity().unregisterReceiver(m_spectrumDataFrameReceiver);
}

有没有办法让片段通过广播接收器接收数据,即使它不可见(在它被销毁之后)?我希望接收器继续获取数据并将其存储在 Fragment 中,即使片段不可见(但活动可见),但我知道我需要在某个时候取消注册广播接收器。

是否应该在Activity被销毁时进行注销(调用其活动进行注销),还是在这里为时已晚?我对 Fragment 生命周期的复杂性还很陌生,不太确定该怎么做。

【问题讨论】:

  • 您可以在 Activity 中注册接收器,因为它始终存在,将数据发送到可见片段,并保存不可见片段的数据。当你显示第二个片段时,让它向活动询问他的数据。
  • 这似乎增加了很多耦合。我觉得片段应该避免知道它所附加的 Activity 的细节,或者它必须从中获取信息。
  • 如何在 onCreate()/onDestroy() 注册/取消注册接收器并将 setRetainInstance() 设置为 true?

标签: android android-fragments broadcastreceiver


【解决方案1】:

每次只使用add方法片段事务而不是replacing每个片段,因此它在不可见时仍然存在。

解决方案:

替换replace使用add

beginTransaction().add(R.id.north_fragment, fragment1, FRAGMENT_TAG).commit();

【讨论】:

  • 那么,如果我在已经存在的位置(R.id.north_fragment)添加一个片段,它不会调用 onDestroyView(),但可能是其他一些片段生命周期方法?暂停()? onStop() ?
  • @StealthRabbi 是的,它不会破坏,因为您将它添加到一个片段的顶部,
  • 我在尝试添加已经存在的片段时遇到以下异常。 java.lang.IllegalStateException: Fragment already added: 此外,在当前第一个片段的位置添加第二个片段,什么也不做。我需要使用 show() / hide() 吗?
【解决方案2】:

您应该在活动 onResume 中注册您的接收器,并在 onPause 中取消注册。只要活动正在运行,您的接收器就会收到广播。然后您可以通过任何方式将接收到的数据传递给相应的片段。

【讨论】:

  • 是的,我意识到我希望在我的片段中注册接收器的愿望不能很好地扩展,特别是如果所有片段都注册相同的东西。我最终同意了你的建议,但我觉得下面 Rod 的回答确实回答了我的问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多