2011-07-07 11 views
1

私はonCreate()メソッドでインスタンス化し、アクティビティのレイアウトにFrameLayoutコンテナを追加するsingleInstanceアクティビティとフラグメントを持っています。アクティビティはログを出力する以外は何もしません。 私は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()リフサイクルメソッドを引き起こして、インテントを実行してアクティビティを再開します。

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 < 

2番目の質問:なぜフラグメントのonResume()メソッドが呼び出されていないのですか?それはまだ画面に表示されます。 fragmenの

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 < 

今のライフサイクル・メソッドは全く起動されません。私の知る限りの活動やライフサイクルメソッドが手をつないで行く必要があります知っている...その後

は私が活動をもう一度再起動しますそれはどうですか?

答えて

3

私はその動作にも気付いていますが、質問1に答えることはできませんが、私はonStopメソッド(onPauseとonResumeが好きです)で多くのことを行うことはめったにありません。

ここでの問題(間違いなくGoogleのバグです)は、FragmentActivityの問題か、アクティビティのライフサイクル全体(どのように見えるかによって異なります)です。

基本的に、FragmentActivityは、フラグメントをonResumeメソッドではなく(一般的に思えばそうであるように)onPostResumeメソッドではなく、再開状態に移動します。これは、onNewIntentでアクティビティが呼び出されたときにonPostResumeメソッドがsingleIntstance/singleTaskアクティビティで呼び出されるということを除いて、すべてうまくいっています。私はちょうどmFragments.dispatchResumeを(呼び出していないことを

だから私は(だけではなく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では、この場合、フラグメントのonResumeメソッドが2回呼び出されるためです。私は100%確信しているわけではありませんが、それは私のテストで気づいたものです。

希望はこのことができます:)

+1

私のヒーロー:)必要なメンバーの可視性がデフォルトに設定されているので、ソースをプロジェクトにインポートする必要はないと言えるでしょう。 srcにandroid.support.v4.appパッケージを作成し、FragmentActivityを拡張するクラスを作成してください。これはmResumedとmFragmentsへのアクセスを提供するのに十分です。 – dskinner

0

これは、関連の発見に私を導いた - 私は、XMLタグから膨張されるフラグメントを持って

。 3.2.1を実行しているXoomでは、正常に動作します。 3.1を実行しているGalaxy 10.1では、フラグメントのonResumeメソッドはとは決してと呼ばれていません。修正が3.2で追加されたように見えます。

0

私は、特定のケースでは、onNewIntentが起動されたときにネストされたフラグメントを再作成していました。正常に動作するためには、クラスメンバーmShouldUpdateFragmentsをセットアップし、onNewIntentでtrueに設定し、ブール値に基づいて作業を行ったonPostResumeをオーバーライドします。

+0

ppl、これはすべてのアンドロイドバージョンでは動作しないので、これを無視する必要があります – dskinner

+0

何らかの理由で完全に異なるログ情報を取得します.... http://stackoverflow.com/questions/11104727/so-why-does- my-log-info-shows-完全に間違った動作 - 動作間 - fragm – Maxrunner

関連する問題