Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/200.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
单实例活动的Android片段生命周期_Android_Lifecycle_Android Fragments_Fragment - Fatal编程技术网

单实例活动的Android片段生命周期

单实例活动的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

我有一个singleInstance活动和一个片段,我在onCreate()方法中实例化了它,并将其添加到活动布局的FrameLayout容器中。该活动除了打印日志之外什么都不做。 我正在使用android-support-v4库和android 2.3.3

我在这个设置中观察到一个奇怪的生命周期行为,不知您是否可以帮我解释一下。我将提供生命周期的日志:

活动的第一次呼叫:

    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的类。这将是一个好消息