2011-07-07 72 views
1

我有一个singleInstance Activity和一个片段,我在onCreate()方法中实例化,并将其添加到一个FrameLayout容器中放入活动的布局中。该活动除了打印日志外不做任何事情。 我正在使用android-support-v4 lib和android 2.3.3。单个实例活动的Android片段生命周期

我观察到一个奇怪的生命周期行为与此设置,我不知道你是否可以帮我解释这一点。我将提供日志的生命周期:

活动的第一次调用:

07-07 15:12:17.990 V/FragActivity(2358): onCreate >> [email protected] 
    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 > [email protected] 
    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 > [email protected] 
    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 < 

第一个问题:为什么是的onStop()片段的创建活动过程中的方法?片段在屏幕上显示正常。

之后,我通过触发意图重新启动活动,导致活动的onNewIntent()lidecycle方法。

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 > [email protected] 
    07-07 15:13:23.231 V/FragActivity(2358): onPause < 
    07-07 15:13:23.231 V/FragActivity(2358): onNewIntent > [email protected] 
    07-07 15:13:26.231 V/FragActivity(2358): onNewIntent < 
    07-07 15:13:26.231 V/FragActivity(2358): onResume > [email protected] 
    07-07 15:13:29.230 V/FragActivity(2358): onResume < 

第二个问题:为什么片段的onResume()方法不被调用?它仍然可以在屏幕上看到。据我了解活动和生命周期方法应当齐头并进......

后,我重新启动活动第二次:

07-07 15:13:42.140 V/FragActivity(2358): onPause > [email protected] 
    07-07 15:13:45.143 V/FragActivity(2358): onPause < 
    07-07 15:13:45.143 V/FragActivity(2358): onNewIntent > [email protected] 
    07-07 15:13:48.144 V/FragActivity(2358): onNewIntent < 
    07-07 15:13:48.150 V/FragActivity(2358): onResume > [email protected] 
    07-07 15:13:51.151 V/FragActivity(2358): onResume < 

现在fragmen的生命周期方法不会被触发,在所有.. 那个怎么样?

回答

3

我无法回答问题1,尽管我也注意到了这种行为,但我很少在我的onStop方法中做很多工作(我赞成onPause和onResume),我可以帮你解决第二个问题。

这里的问题(这肯定是一个谷歌的bug)是FragmentActivity或整个Activity生命周期的问题(取决于你如何看待它)。

基本上,FragmentActivity将其片段移动到恢复状态,而不是在onResume方法(正如一般人理智的人可能会想到的)中,而是在onPostResume方法中。这一切都很好,除了当onNewIntent调用活动时,onPostResume方法永远不会在singleIntstance/singleTask活动中调用。

所以我没有(已导入的支持包代码,而不是仅仅罐子)为修改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; 
} 

注意,我不只是调用mFragments.dispatchResume()在onNewIntent中会导致在这种情况下两次调用片段onResume方法。我不是100%确定这是为什么,但这是我在测试中注意到的。

希望这有助于:)

+1

您的我的英雄:)我认为值得一提的是,您不必将源代码导入到您的项目中,因为所需成员的可见性被设置为默认值。只需在你的src和一个扩展FragmentActivity的类中创建一个android.support.v4.app包。这足以提供对mResumed和mFragments的访问。 – dskinner

0

这使我相关的发现 -

我有一个从XML标签膨胀的片段。在运行3.2.1的Xoom上,事情按预期工作。在运行3.1的Galaxy 10.1上,该片段的onResume方法为,从未称为。看起来可能已经在3.2中添加了修复程序。

0

我只想添加到Geoff的评论,在我的具体情况下,当onNewIntent被触发时,我重新创建了一组嵌套片段,并且为了成功工作,我设置了一个类成员mShouldUpdateFragments,在onNewIntent中设置它为true,并重写onPostResume,我根据布尔值完成了我的工作。

+0

人工智能,你应该忽视这一点,因为这不适用于所有的Android版本 – dskinner

+0

我得到一个完全不同的日志信息出于某种原因.... http://stackoverflow.com/questions/11104727/so-why-does-我的日志 - 信息 - 显示 - 完全-错误的行为之间的活动,fragm – Maxrunner