Вызов super.onCreate() с нулевым параметром?

В onCreate(Bundle bdl){} мы должны назвать его супер-конструктор super.onCreate(bdl).

Для вновь созданных действий мы получили нулевой пакет в onCreate(Bundle bdl){}. Поэтому, когда мы вызываем super.onCreate(bdl), это то же самое, что и вызов super.onCreate(null).

Для восстановленных действий (например, после поворота) мы получили ненулевой пучок. Но я замечаю, что даже если мы назовем super.onCreate(null), а не super.onCreate(bdl), это похоже на то же самое. Работы по восстановлению макета выполняются в super.onRestoreInstanceState(bdl).

Итак, действительно ли верно, что вызов super.onCreate(null) совпадает с вызовом super.onCreate(bdl) во всех случаях?

Спасибо.

Ответ 1

Согласно исходному коду 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);
        }
    }
}

Ответ 2

Самый простой способ узнать это - использовать утилиту Log().

Хотя, не забывайте, что вы можете поместить материал в пакет с помощью

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

И извлеките их с помощью getArguments().

Итак, вкратце - это зависит от того, используете ли вы аргументы в вашем приложении. Если нет, то это, вероятно, то же самое.