片段的onActivityCreated()在Activity的onDestroy()之后调用

时间:2013-03-05 07:16:21

标签: android android-fragments android-ui

今天我在应用程序中发现了一个奇怪的行为。

当我使用Eclipse的Devices视图停止我的应用程序时会发生这种情况。有人可以解释一下吗?

即使onActivityCreated()已被销毁,为什么Fragment的{​​{1}}被调用? Activity包含两个MyHomeActivity,并为两者生成类似的日志。

我在这里粘贴一个Fragment的日志。 Fragment是次要问题。

当我从NullPointerException onActivityCreated()启动调用堆栈时调用onDestroy()时,我感到很惊讶?

MyHomeActivity

我正在使用支持库为蜜蜂前设备提供03-05 12:31:21.414: W/System.err(5638): java.lang.NullPointerException 03-05 12:31:21.421: W/System.err(5638): at **MyListViewFrag.onActivityCreated**(BuddyListViewFrag.java:85) 03-05 12:31:21.421: W/System.err(5638): at android.support.v4.app.Fragment.performActivityCreated(Fragment.java:1468) 03-05 12:31:21.421: W/System.err(5638): at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:931) 03-05 12:31:21.421: W/System.err(5638): at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1088) 03-05 12:31:21.421: W/System.err(5638): at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1070) 03-05 12:31:21.421: W/System.err(5638): at android.support.v4.app.FragmentManagerImpl.dispatchReallyStop(FragmentManager.java:1888) 03-05 12:31:21.421: W/System.err(5638): at android.support.v4.app.FragmentActivity.onReallyStop(FragmentActivity.java:787) 03-05 12:31:21.421: W/System.err(5638): at android.support.v4.app.FragmentActivity.doReallyStop(FragmentActivity.java:764) 03-05 12:31:21.421: W/System.err(5638): at android.support.v4.app.FragmentActivity.onDestroy(FragmentActivity.java:322) 03-05 12:31:21.421: W/System.err(5638): at MyFragmentActivity.onDestroy(RbrFragmentActivity.java:57) 03-05 12:31:21.421: W/System.err(5638): at **MyHomeActivity.onDestroy**(MyHomeActivity.java:254) 03-05 12:31:21.421: W/System.err(5638): at android.app.ActivityThread.performDestroyActivity(ActivityThread.java:2663) 03-05 12:31:21.421: W/System.err(5638): at android.app.ActivityThread.handleDestroyActivity(ActivityThread.java:2694) 03-05 12:31:21.421: W/System.err(5638): at android.app.ActivityThread.access$2100(ActivityThread.java:117) 03-05 12:31:21.421: W/System.err(5638): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:968) 03-05 12:31:21.421: W/System.err(5638): at android.os.Handler.dispatchMessage(Handler.java:99) 03-05 12:31:21.421: W/System.err(5638): at android.os.Looper.loop(Looper.java:130) 03-05 12:31:21.421: W/System.err(5638): at android.app.ActivityThread.main(ActivityThread.java:3687) 03-05 12:31:21.429: W/System.err(5638): at java.lang.reflect.Method.invokeNative(Native Method) 03-05 12:31:21.429: W/System.err(5638): at java.lang.reflect.Method.invoke(Method.java:507) 03-05 12:31:21.429: W/System.err(5638): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:867) 03-05 12:31:21.429: W/System.err(5638): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:625) 03-05 12:31:21.429: W/System.err(5638): at dalvik.system.NativeStart.main(Native Method) ,如果这有任何区别的话。

1 个答案:

答案 0 :(得分:14)

经过一些测试和审核FragmentManager.moveToState后,我相信当FragmentFragmentPagerAdapter处理时,以前合并到的Fragment是不可避免的savedState(作为在从eclipse中的DDMS选项卡中终止进程之前停止应用程序的过程的一部分),必须首先“创建”(在FragmentManager的术语中)才能销毁它。

这实际上可能是从已保存状态重建片段的过程的意外后果。当FragmentActivity正在执行onCreate并且finish()被调用时,意图是FragmentActivity停止设置并退出。视觉体验是这种情况发生的,但似乎FragmentManager自己继续使用以前存在的Fragment,带有一些捷径的albiet的生命周期。此过程似乎执行最终onActivityCreated的生命周期方法,然后执行onDestroyonDetach,跳过介于两者之间的方法。

处理此问题的最佳方法似乎是解决此启动导致的次要问题(在本例中为您的NPE)。似乎在Fragment生命周期中可以有优化空间,但是对于r12支持库,情况似乎是设计的结果。