android-fragments 什么是Activity.isFinishing()的等效片段?

jyztefdp  于 2022-11-13  发布在  Android
关注(0)|答案(4)|浏览(230)

在我的活动中,我经常使用这个成语:

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

Fragment有一个onDestroy()方法,但是isFinishing()的等价方法是什么呢?我应该只在fragment的onDestroy()中检查getActivity().isFinishing()吗?
编辑以添加:
下面是我在各种情况下得到的回调(按顺序),沿着getActivity()是否返回空值或非空值,如果非空值,则返回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
mi7gmzs6

mi7gmzs61#

片段有一个名为isRemoving()的方法,当从“活动”中删除片段时,该方法为true:
如果此片段当前正从其Activity中移除,则返回true。这不是其Activity是否正在完成,而是它是否正处于从其Activity中移除的过程中。

6yoyoihd

6yoyoihd2#

谢谢你们的帮助。我最后把这些添加到我的对话片段中:

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();
}

基于我添加到原始问题中的回调行为,我认为这符合我的目的。当父活动被OS破坏并打算稍后被恢复时,它们不被释放。

c6ubokkw

c6ubokkw3#

如果要逐个清除片段引用,可以使用此帮助器方法进行片段替换

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 扩展所有Activity,从 BaseFragment 扩展所有片段。此外,如果您堆叠片段,则可能应该扩展更多片段,例如 onBackPressed()

f5emj3cl

f5emj3cl4#

我认为这个Kotlin扩展函数会起到作用。至少如果您使用的是“导航框架”

fun Fragment.isFinishing(): Boolean {
   val name = this.javaClass.name

   val thisEntry = findNavController().backQueue.find {
       val destination = it.destination
       destination is FragmentNavigator.Destination && destination.className == name
    }

    return thisEntry == null
}

相关问题