单实例活动的Android片段生命周期
我有一个singleInstance活动和一个片段,我在onCreate()方法中实例化了它,并将其添加到活动布局的FrameLayout容器中。该活动除了打印日志之外什么都不做。 我正在使用android-support-v4库和android 2.3.3 我在这个设置中观察到一个奇怪的生命周期行为,不知您是否可以帮我解释一下。我将提供生命周期的日志: 活动的第一次呼叫:单实例活动的Android片段生命周期,android,lifecycle,android-fragments,fragment,Android,Lifecycle,Android Fragments,Fragment,我有一个singleInstance活动和一个片段,我在onCreate()方法中实例化了它,并将其添加到活动布局的FrameLayout容器中。该活动除了打印日志之外什么都不做。 我正在使用android-support-v4库和android 2.3.3 我在这个设置中观察到一个奇怪的生命周期行为,不知您是否可以帮我解释一下。我将提供生命周期的日志: 活动的第一次呼叫: 07-07 15:12:17.990 V/FragActivity( 2358): onCreate >&g
07-07 15:12:17.990 V/FragActivity( 2358): onCreate >> com.test.fragmentlife.FragActivity@44f98778
07-07 15:12:21.010 V/FragActivity( 2358): onCreate <<
07-07 15:12:21.020 V/LayoutFragment( 2358): onAttach > LayoutFragment{44f467c8 #0 id=0x7f070000}
07-07 15:12:24.021 V/LayoutFragment( 2358): onAttach <
07-07 15:12:24.021 V/LayoutFragment( 2358): onCreate > LayoutFragment{44f467c8 #0 id=0x7f070000}
07-07 15:12:27.020 V/LayoutFragment( 2358): onCreate <
07-07 15:12:27.020 V/LayoutFragment( 2358): onCreateView > LayoutFragment{44f467c8 #0 id=0x7f070000}
07-07 15:12:30.022 V/LayoutFragment( 2358): onCreateView <
07-07 15:12:30.030 V/LayoutFragment( 2358): onActivityCreated > LayoutFragment{44f467c8 #0 id=0x7f070000}
07-07 15:12:33.030 V/LayoutFragment( 2358): onActivityCreated <
07-07 15:12:33.030 V/LayoutFragment( 2358): onStart > LayoutFragment{44f467c8 #0 id=0x7f070000}
07-07 15:12:36.030 V/LayoutFragment( 2358): onStart <
07-07 15:12:36.040 V/FragActivity( 2358): onStart > com.test.fragmentlife.FragActivity@44f98778
07-07 15:12:39.041 V/FragActivity( 2358): onStart <
07-07 15:12:39.041 V/LayoutFragment( 2358): onStop > LayoutFragment{44f467c8 #0 id=0x7f070000}
07-07 15:12:42.040 V/LayoutFragment( 2358): onStop <
07-07 15:12:42.040 V/FragActivity( 2358): onResume > com.test.fragmentlife.FragActivity@44f98778
07-07 15:12:45.041 V/FragActivity( 2358): onResume <
07-07 15:12:45.041 V/LayoutFragment( 2358): onStart > LayoutFragment{44f467c8 #0 id=0x7f070000}
07-07 15:12:48.040 V/LayoutFragment( 2358): onStart <
07-07 15:12:48.040 V/LayoutFragment( 2358): onResume > LayoutFragment{44f467c8 #0 id=0x7f070000}
07-07 15:12:51.042 V/LayoutFragment( 2358): onResume <
07-07 15:12:17.990 V/碎片活动(2358):onCreate>>com.test.fragmentlife。FragActivity@44f98778
07-07 15:12:21.010 V/FragActivity(2358):onCreate LayoutFragment{44f467c8#0id=0x7f070000}
07-07 15:12:24.021 V/LayoutFragment(2358):Nantach<
07-07 15:12:24.021 V/LayoutFragment(2358):onCreate>LayoutFragment{44f467c8#0ID=0x7f070000}
07-07 15:12:27.020 V/LayoutFragment(2358):onCreate<
07-07 15:12:27.020 V/LayoutFragment(2358):onCreateView>LayoutFragment{44f467c8#0ID=0x7f070000}
07-07 15:12:30.022 V/LayoutFragment(2358):onCreateView<
07-07 15:12:30.030 V/LayoutFragment(2358):onActivityCreated>LayoutFragment{44f467c8#0ID=0x7f070000}
07-07 15:12:33.030 V/LayoutFragment(2358):激活已创建<
07-07 15:12:33.030 V/LayoutFragment(2358):onStart>LayoutFragment{44f467c8#0ID=0x7f070000}
07-07 15:12:36.030 V/LayoutFragment(2358):开始<
07-07 15:12:36.040 V/碎片活动(2358):启动>com.test.fragmentlife。FragActivity@44f98778
07-07 15:12:39.041 V/FragaActivity(2358):启动<
07-07 15:12:39.041 V/LayoutFragment(2358):顶部>LayoutFragment{44f467c8#0ID=0x7f070000}
07-07 15:12:42.040 V/LayoutFragment(2358):顶部<
07-07 15:12:42.040 V/碎片活动(2358):onResume>com.test.fragmentlife。FragActivity@44f98778
07-07 15:12:45.041 V/FragaActivity(2358):恢复<
07-07 15:12:45.041 V/LayoutFragment(2358):onStart>LayoutFragment{44f467c8#0ID=0x7f070000}
07-07 15:12:48.040 V/LayoutFragment(2358):启动<
07-07 15:12:48.040 V/LayoutFragment(2358):onResume>LayoutFragment{44f467c8#0id=0x7f070000}
07-07 15:12:51.042 V/LayoutFragment(2358):继续<
第一个问题:为什么在创建活动期间片段的onStop()方法会失败?碎片在屏幕上显示良好
之后,我通过触发一个intent来重新启动活动,从而导致活动的onNewIntent()循环方法
07-07 15:13:17.220 V/LayoutFragment( 2358): onPause > LayoutFragment{44f467c8 #0 id=0x7f070000}
07-07 15:13:20.220 V/LayoutFragment( 2358): onPause <
07-07 15:13:20.230 V/FragActivity( 2358): onPause > com.test.fragmentlife.FragActivity@44f98778
07-07 15:13:23.231 V/FragActivity( 2358): onPause <
07-07 15:13:23.231 V/FragActivity( 2358): onNewIntent > com.test.fragmentlife.FragActivity@44f98778
07-07 15:13:26.231 V/FragActivity( 2358): onNewIntent <
07-07 15:13:26.231 V/FragActivity( 2358): onResume > com.test.fragmentlife.FragActivity@44f98778
07-07 15:13:29.230 V/FragActivity( 2358): onResume <
07-07 15:13:17.220 V/LayoutFragment(2358):onPause>LayoutFragment{44f467c8#0id=0x7f070000}
07-07 15:13:20.220 V/LayoutFragment(2358):开启暂停<
07-07 15:13:20.230 V/碎片活性(2358):开启暂停>com.test.fragmentlife。FragActivity@44f98778
07-07 15:13:23.231 V/FragActivity(2358):开启暂停<
07-07 15:13:23.231 V/碎片活动(2358):onNewIntent>com.test.fragmentlife。FragActivity@44f98778
07-07 15:13:26.231 V/FragaActivity(2358):无连接<
07-07 15:13:26.231 V/碎片活动(2358):onResume>com.test.fragmentlife。FragActivity@44f98778
07-07 15:13:29.230 V/FragActivity(2358):恢复<
第二个问题:为什么片段的onResume()方法没有被调用?它仍然可以在屏幕上看到。据我所知,活动和生命周期方法应该齐头并进
之后,我再次重新启动活动:
07-07 15:13:42.140 V/FragActivity( 2358): onPause > com.test.fragmentlife.FragActivity@44f98778
07-07 15:13:45.143 V/FragActivity( 2358): onPause <
07-07 15:13:45.143 V/FragActivity( 2358): onNewIntent > com.test.fragmentlife.FragActivity@44f98778
07-07 15:13:48.144 V/FragActivity( 2358): onNewIntent <
07-07 15:13:48.150 V/FragActivity( 2358): onResume > com.test.fragmentlife.FragActivity@44f98778
07-07 15:13:51.151 V/FragActivity( 2358): onResume <
07-07 15:13:42.140伏/碎片活动(2358):开启暂停>com.test.fragmentlife。FragActivity@44f98778
07-07 15:13:45.143 V/FragActivity(2358):开启暂停<
07-07 15:13:45.143V/碎片活性(2358):onNewIntent>com.test.fragmentlife。FragActivity@44f98778
07-07 15:13:48.144伏/帧活动(2358):无连接<
07-07 15:13:48.150 V/碎片活性(2358):onResume>com.test.fragmentlife。FragActivity@44f98778
07-07 15:13:51.151伏/帧活动(2358):恢复<
现在fragmen的生命周期方法根本不会被触发。。这是怎么回事?我无法回答问题1,尽管我也注意到了这种行为,但我很少使用我的桌面方法(我喜欢暂停和恢复),我可以帮助回答第二个问题 这里的问题(这肯定是一个google bug)要么是活动片段的问题,要么是整个活动生命周期的问题(取决于您如何看待它) 基本上,FragmentActivity将其片段移动到恢复状态,而不是在onResume方法中(通常理智的人可能会这样认为),而是在onPostResume方法中。这一切都很好,除了当使用onNewIntent调用活动时,在singleIntstance/singleTask活动中永远不会调用onPostResume方法 所以我所做的(导入了支持包代码,而不仅仅是jar)是修改FragmentActivity,就像这样
//this boolean is only ever set to true in onNewIntent
private boolean mResumeNeedsToDoDispatch = false;
/**
* Ensure any outstanding fragment transactions have been committed.
*/
@Override
protected void onResume() {
super.onResume();
mResumed = true;
//Check if onNewIntent was called. If so, dispatch resumes to fragments now
if (mResumeNeedsToDoDispatch) {
mResumeNeedsToDoDispatch = false;
mFragments.dispatchResume();
}
mFragments.execPendingActions();
}
/**
* Google, I think you forgot this #(
*/
@Override
public void onNewIntent(Intent newIntent) {
super.onNewIntent(newIntent);
mResumeNeedsToDoDispatch = true;
}
注意,我并不是在onNewIntent中只调用mffragments.dispatchResume(),因为在本例中,这会导致对fragment onResume方法调用两次。我不是100%确定这是为什么,但这是我在测试中注意到的
希望这有帮助:)这让我找到了一个相关的发现--
我有一个从xml标记中膨胀出来的片段。在运行3.2.1的Xoom上,一切正常。在运行3.1的Galaxy 10.1上,片段的onResume方法是从未调用过。看起来修复程序可能是在3.2中添加的。我只想添加到Geoff的注释中,在我的特殊情况下,当启动onNewIntent时,我正在重新创建一组嵌套片段,为了使其成功工作,我设置了一个类成员mShouldUpdateFragments,并在onNewIntent中将其设置为true,以及重写onPostResume,其中我基于布尔值进行了工作。my hero:)我认为值得一提的是,您不必将源文件导入到项目中,因为所需成员的可见性设置为默认值。只需在src中创建一个android.support.v4.app包和一个扩展FragmentActivity的类。这将是一个好消息