Фрагмент жизненного цикла - PullRequest
       42

Фрагмент жизненного цикла

0 голосов
/ 28 сентября 2018

Я пытаюсь понять внутреннее поведение фрагментов Android.Есть сомнения между точной разницей между onDestroy(), onDetach() и

void onDestroy ()

Вызывается, когда фрагмент больше не используется.Вызывается после onStop() и до onDetach().

void onDetach ()

Вызывается, когда фрагмент больше не привязан к своей активности.Это вызывается после onDestroy ().

Запрос: Если фрагмент больше не используется, означает, что мы можем удалить этот фрагмент из Activity правильно?

В этом случаезачем сначала вызывать onDestroy (), а затем onDetach (). Мы можем использовать только один метод для указания состояния, что «фрагмент больше не используется, можно удалить действие»

Ответы [ 2 ]

0 голосов
/ 28 сентября 2018

Если вы изучили весь жизненный цикл фрагмента, то

onAttach() onCreate()

являются аналогом

onDetach() onDestroy()

метода жизненного цикла соответственно.Таким образом, чтобы не нарушать последовательность вызова метода жизненного цикла согласованности проекта, выполните следующие действия:

onAttach() 
onCreate()
onDestroy()
onDetach() 

Теперь давайте перейдем к вашему запросу

Запрос: Если фрагмент больше не используется, это означает, что мы можемудалить этот фрагмент из Activity правильно?

В этом случае зачем сначала вызывать onDestroy (), а затем onDetach (). Мы можем использовать только один метод, чтобы указать, что «Фрагмент больше не используется, может бытьудаленное действие "

Android всегда пытается сохранить своего аналога.ответ на ваш вопрос, почему onAttached первым дает ответ на ваш запрос

Фрагмент разработан, чтобы быть независимым от активности. OnAttach () предоставляет интерфейс для определения состояния / типа / (другой детали, которая имеет значение для фрагмента)содержащая активность со ссылкой на фрагмент перед инициализацией фрагмента.

0 голосов
/ 28 сентября 2018

onDestroy () : onDestroy() вызывается для окончательной очистки состояния фрагмента, но не гарантированно вызывается платформой Android. (Вызывается, когда фрагмент больше не используется, после onStop и перед onDetach ())

onDetach () : onDetach() вызывается после onDestroy(),уведомить, что фрагмент был оторван от его хостинг-активности. (вызывается, когда фрагмент больше не привязан к своей активности)

ref : android-фрагмент-жизненный цикл , onDestroy , onDetach

взгляните на класс Fragment (строка 1564), executeDestroy вызывается первым, если f.mReservation имеет значение false:

if (DEBUG) Log.v(TAG, "movefrom CREATED: " + f);
if (!f.mRetaining) {

        //performDestroy is called first if f.mRetaining is false, else not
        f.performDestroy();
        dispatchOnFragmentDestroyed(f, false);
} else {
        f.mState = Fragment.INITIALIZING;
}
//then performDetach
f.performDetach();
dispatchOnFragmentDetached(f, false);
if (!keepActive) {
        if (!f.mRetaining) {
            makeInactive(f);
        } else {
            f.mHost = null;
            f.mParentFragment = null;
            f.mFragmentManager = null;
        }
}

И воткод executeDestroy и executeDetach:

void performDestroy() {
        mLifecycleRegistry.handleLifecycleEvent(Lifecycle.Event.ON_DESTROY);
        if (mChildFragmentManager != null) {
            mChildFragmentManager.dispatchDestroy();
        }
        mState = INITIALIZING;
        mCalled = false;
        mIsCreated = false;
        onDestroy();
        if (!mCalled) {
            throw new SuperNotCalledException("Fragment " + this
                    + " did not call through to super.onDestroy()");
        }
        mChildFragmentManager = null;
    }

    void performDetach() {
        mCalled = false;
        onDetach();
        mLayoutInflater = null;
        if (!mCalled) {
            throw new SuperNotCalledException("Fragment " + this
                    + " did not call through to super.onDetach()");
        }

        // Destroy the child FragmentManager if we still have it here.
        // We won't unless we're retaining our instance and if we do,
        // our child FragmentManager instance state will have already been saved.
        if (mChildFragmentManager != null) {
            if (!mRetaining) {
                throw new IllegalStateException("Child FragmentManager of " + this + " was not "
                        + " destroyed and this fragment is not retaining instance");
            }
            mChildFragmentManager.dispatchDestroy();
            mChildFragmentManager = null;
        }
    }
...