Что эквивалентно фрагменту Activity.isFinishing()?

В своей деятельности я часто использую эту идиому:

@Override
public void onDestroy() {
    super.onDestroy();
    if (isFinishing() != true) return;
    // do some final cleanup since we're going away for good
}

Фрагмент имеет метод onDestroy(), но что эквивалентно isFinishing()? Должен ли я просто проверить getActivity().isFinishing() внутри фрагмента onDestroy()?

ИЗМЕНИТЬ ДОБАВИТЬ:

Вот обратные вызовы (по порядку), которые я получаю при различных обстоятельствах, вместе с тем, возвращает ли getActivity() значение null или non-null и, если не null, значение getActivity().isFinishing():

Сценарий # 1: DialogFragment показывает и пользователь отбрасывает кнопку (то есть нужно освобождать ссылки):

onDismiss(): activity = non-null, finishing = false
onDestroy(): activity = non-null, finishing = false

Сценарий №2: DialogFragment отображается, а родительская активность заканчивается (т.е. нужно освобождать ссылки):

onDestroy(): activity = non-null, finishing = true
onDismiss(): activity = null, finishing = n/a

Сценарий №3: DialogFragment отображается, и ОС временно уничтожает родительскую активность (т.е. не следует отпускать ссылки):

onDestroy(): activity = non-null, finishing = false
onDismiss(): activity = null, finishing = n/a

Ответы

Ответ 1

Фрагменты имеют метод isRemoving(), который является истинным, когда фрагмент удаляется из Activity:

Возвращает true, если этот фрагмент в настоящее время удаляется из его активности. Дело не в том, заканчивается ли его деятельность, а в том, находится ли она в процессе удаления из своей деятельности.

Ответ 2

Спасибо за помощь ребятам. В итоге я добавил их в свой диалог:

private void doReleaseReferences() {
    // release the stuff
}

@Override
public void onDestroy() {
    super.onDestroy();
    if (getActivity().isFinishing())
        doReleaseReferences();
}

@Override
public void onDismiss(DialogInterface dialog) {
    super.onDismiss(dialog);
    if (getActivity() != null)
        doReleaseReferences();
}

Основываясь на обратном обращении, я добавил к первому вопросу, который, как мне кажется, служит моим целям. Когда нажата кнопка "Назад" или завершается родительская активность, ссылки отпускаются; когда родительская активность уничтожается ОС с целью ее возобновления позже, они не освобождаются.

Ответ 3

Если вы хотите очистить ссылки на фрагменты на основе, вы можете использовать этот вспомогательный метод для замены фрагмента

public abstract class BaseActivity extends AppCompatActivity {

    @Override
    protected void onDestroy() {
        if (isFinishing()) {
            notifyStackedFragmentsFinishing();
        }
        super.onDestroy();
    }

    protected void changeFragment(Fragment fragment) {
         notifyStackedFragmentsFinishing();
         getSupportFragmentManager().beginTransaction()
            .replace(R.id.fragment, fragment)
            .commit();
    }

    private void notifyStackedFragmentsFinishing() {
        List<Fragment> fragments = getSupportFragmentManager().getFragments();
        if (fragments != null && !fragments.isEmpty()) {
            for (Fragment fragment : fragments) {
                ((BaseFragment) fragment).releaseOnFinishing();
            }
        }
    }

 }

Теперь вы можете расширить все свои действия из BaseActivity и всех своих фрагментов из BaseFragment. Кроме того, если вы складываете фрагменты, вы, вероятно, должны расширить расширение i.e.BackPressed()