1

onCreate() メソッドでインスタンス化し、アクティビティのレイアウトに FrameLayout コンテナーに追加する singleInstance アクティビティと Fragment があります。このアクティビティは、ログを出力する以外は何もしません。私はandroid-support-v4 libと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 <

最初の質問: アクティビティの作成中にフラグメントの 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 > 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 <

2 番目の質問: フラグメントの 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 <

現在、fragmen のライフサイクル メソッドはまったくトリガーされていません。

4

3 に答える 3

3

質問1には答えられませんが、その動作にも気づきましたが、onStopメソッド(onPauseとonResumeを好む)で多くの作業を行うことはめったにありません。2番目の質問を支援できます。

ここでの問題(これは間違いなくグーグルのバグです)は、FragmentActivityまたはActivityライフサイクル全体の問題です(見方によって異なります)。

基本的に、FragmentActivityは、onResumeメソッドではなく(一般的に正気の人が考えるように)、onPostResumeメソッドでフラグメントを再開状態に移動します。アクティビティがonNewIntentで呼び出されたときに、onPostResumeメソッドがsingleIntstance / singleTaskアクティビティで呼び出されないことを除いて、これはすべてうまくいきます。

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

お役に立てれば :)

于 2011-07-12T00:56:08.123 に答える
0

これは、関連する発見に私を導きました -

xml タグから膨張したフラグメントがあります。3.2.1 を実行している Xoom では、期待どおりに動作します。3.1 を実行している Galaxy 10.1 では、フラグメントの onResume メソッドは呼び出されません。3.2で修正が追加されたようです。

于 2011-12-05T23:30:28.690 に答える
0

ジェフのコメントに追加したいだけです。私の特定のケースでは、onNewIntent が起動されたときにネストされたフラグメントのセットを再作成していました。それが正常に機能するために、クラス メンバー mShouldUpdateFragments をセットアップし、onNewIntent で true に設定し、onPostResume をオーバーライドします。私はブール値に基づいて仕事をしました。

于 2012-05-10T19:51:26.867 に答える