片段onStop()在onStart()之后直接调用 – 为什么?

我的应用程序有一个奇怪的问题 –

A有一个包含片段的片段活动 – 该片段启动一个AsyncTask onCreate()并取消AsyncTask onStop()。 我的问题出现了,因为虽然我的片段保持运行&不被模糊它onStop()被称为几乎直接后onCreate()。

有谁知道如何跟踪为什么会发生这种情况?

09-28 11:41:56.785: VERBOSE/SearchFragment1(924): onCreate() 09-28 11:41:56.796: VERBOSE/SearchFragment1(924): onStop() 

编辑

我已经从片段中删除了代码,而且我仍然非常困惑 – 问题依然存在! 我已经添加了几行日志logging:

 09-28 14:09:00.242: VERBOSE/SearchResultsFragment1(1789): onAttach() 09-28 14:09:00.242: VERBOSE/SearchResultsFragment1(1789): onCreate() 09-28 14:09:00.242: VERBOSE/SearchResultsFragment1(1789): onCreateView() 09-28 14:09:00.242: VERBOSE/SearchResultsFragment1(1789): onActivityCreated() 09-28 14:09:00.242: VERBOSE/SearchResultsFragment1(1789): onStart() 09-28 14:09:00.246: VERBOSE/SearchResultsFragment1(1789): onStop() 09-28 14:09:00.246: VERBOSE/SearchResultsFragment1(1789): onStart() 09-28 14:09:00.246: VERBOSE/SearchResultsFragment1(1789): onResume() 

上述行为是…莫名其妙。 在Activity中使用的代码如下所示:

 if(savedInstanceState == null) { try { FragmentTransaction transaction= getSupportFragmentManager().beginTransaction(); Fragment currentFragment= (Fragment)Class.forName(getIntent().getAction()).newInstance(); transaction.replace(R.id.singlePane, currentFragment); transaction.commit(); } catch ... 

这是debugging过程中的片段:

 private static final boolean LOGGING_ENABLED = true; private static int global_creation_count = 0; private int local_count = global_creation_count; @Override public void onAttach(Activity activity) { super.onAttach(activity); if(LOGGING_ENABLED) Log.v(this.getClass().getSimpleName() + local_count, "onAttach()"); } @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); global_creation_count+=1; if(LOGGING_ENABLED) Log.v(this.getClass().getSimpleName() + local_count, "onCreate()"); } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { if(LOGGING_ENABLED) Log.v(this.getClass().getSimpleName() + local_count, "onCreateView()"); return super.onCreateView(inflater, container, savedInstanceState); } @Override public void onActivityCreated(Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); if(LOGGING_ENABLED) Log.v(this.getClass().getSimpleName() + local_count, "onActivityCreated()"); } @Override public void onStart() { super.onStart(); if(LOGGING_ENABLED) Log.v(this.getClass().getSimpleName() + local_count, "onStart()"); } @Override public void onResume() { super.onResume(); if(LOGGING_ENABLED) Log.v(this.getClass().getSimpleName() + local_count, "onResume()"); } // Fragment is active @Override public void onPause() { super.onPause(); if(LOGGING_ENABLED) Log.v(this.getClass().getSimpleName() + local_count, "onPause()"); } @Override public void onStop() { super.onStop(); if(LOGGING_ENABLED) Log.v(this.getClass().getSimpleName() + local_count, "onStop()"); } @Override public void onDestroyView() { super.onDestroyView(); if(LOGGING_ENABLED) Log.v(this.getClass().getSimpleName() + local_count, "onDestroyView()"); } @Override public void onDestroy() { super.onDestroy(); if(LOGGING_ENABLED) Log.v(this.getClass().getSimpleName() + local_count, "onDestroy()"); } @Override public void onDetach() { super.onDetach(); if(LOGGING_ENABLED) Log.v(this.getClass().getSimpleName() + local_count, "onDetach()"); } 

EDIT2

从代码看来onStop()在onStart()之后被直接调用。 我试图通过在onCreateView()中添加Thread.sleep(1000)来查看它是否与onStart()同时被调用。 输出是相同的 – 这使我相信onStop()被直接从Fragment创build过程中调用/导致。

EDIT3

堆栈跟踪onStop()时: 在这里输入图像说明

我将尝试附加源代码并逐步发现问题所在。

Solutions Collecting From Web of "片段onStop()在onStart()之后直接调用 – 为什么?"

仍然不知道它在做什么…我研究了从哪里获得所涉及的类的源代码调用onStop(),并发现android-support-v4.jar的源代码与jar中的SDK。

虽然我很快就发现它不同步,并且我的android-support-v4.jar和SDK的当前版本差别很大。

用与SDK一起打包的jar代替即时修复问题,在onStart()之后不调用onStop()。 不知道是什么错误造成这个,但最新版本似乎很小心地解决它。