3

ではonCreate(Bundle bdl){}、スーパー コンストラクターを で呼び出す必要がありますsuper.onCreate(bdl)

新しく作成されたアクティビティの場合、 で null Bundle を取得しましたonCreate(Bundle bdl){}。したがって、 を呼び出すときは、 を呼び出すsuper.onCreate(bdl)のと同じsuper.onCreate(null)です。

再構築されたアクティビティ (ローテーション後など) の場合、null 以外のバンドルを取得しました。しかしsuper.onCreate(null)、 の代わりにを呼び出してもsuper.onCreate(bdl)、まったく同じように見えることに気付きました。でレイアウト復元工事を行いましたsuper.onRestoreInstanceState(bdl)

では、呼び出しはすべての場合でsuper.onCreate(null)呼び出しと同じであるというのは本当ですか?super.onCreate(bdl)

ありがとう。

4

2 に答える 2

10

Androidのソースコードによると、このActivity.onCreate()メソッドはsaveInstanceStateバンドルをアクティビティのフラグメントに転送します。具体的には、「android:fragments」キーを使用してパーセルをフェッチし、FragmentManager.restoreAllStates()メソッドを使用してこのパーセルをフラグメントに転送します。このメソッド自体がすべてのフラグメントの状態を復元します。

このActivity.onRestoreInstanceState()メソッドは、バンドルをアクティビティのウィンドウに転送します。ここでも、保存されたインスタンスから「android:viewHierarchyState」バンドルをフェッチし、Window.restoreHierarchyState()メソッドを使用してウィンドウに転送します。

したがって、質問に答えるために、アクティビティでフラグメントが使用されていない場合、実際に呼び出しsuper.onCreate(null)ても何も変わりません。ただし、ベストプラクティスとして、常に正確なsavedInstanceバンドルを転送することをお勧めします(何をしているのかわからない場合)。

編集:これは私が話したサンプルソースコードで、AOSP v17から取られたものです:

Activity.java

protected void onCreate(Bundle savedInstanceState) {

    // [... some content ellipsed for readability purposes]

    if (savedInstanceState != null) {
        Parcelable p = savedInstanceState.getParcelable(FRAGMENTS_TAG);
        mFragments.restoreAllState(p, mLastNonConfigurationInstances != null
                ? mLastNonConfigurationInstances.fragments : null);
    }
    mFragments.dispatchCreate();
    getApplication().dispatchActivityCreated(this, savedInstanceState);
    mCalled = true;
}


// [...]

protected void onRestoreInstanceState(Bundle savedInstanceState) {
    if (mWindow != null) {
        Bundle windowState = savedInstanceState.getBundle(WINDOW_HIERARCHY_TAG);
        if (windowState != null) {
            mWindow.restoreHierarchyState(windowState);
        }
    }
}
于 2013-02-27T15:54:55.527 に答える
0

これを見つける最も簡単な方法は、Log() ユーティリティを使用することです。

ただし、バンドルに物を入れることができることを心に留めておいてください

Bundle bdl = new Bundle(1);
bdl.putString("file_absolute_path", f.getAbsolutePath());
cf.setArguments(bdl);

で取得しますgetArguments()

つまり、アプリでバンドル引数を使用しているかどうかによって異なります。いいえの場合は、おそらく同じです。

于 2013-02-27T15:38:30.307 に答える