【发布时间】: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