Что эквивалентно фрагменту 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()