什么是Activity.isFinishing()的片段等价物?

时间:2014-08-22 15:40:37

标签: android android-activity android-fragments android-lifecycle

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

@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还是非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

3 个答案:

答案 0 :(得分:13)

片段有一个名为isRemoving()的方法,当从活动中删除片段时,该方法为真:

  

如果此片段当前正从其活动中删除,则返回true。这不是它的活动是否正在完成,而是它是否正在被从活动中删除。

答案 1 :(得分:3)

感谢帮助人员。我最后将这些添加到我的DialogFragment:

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

基于我在原始问题中添加的回调行为,我认为这符合我的目的。当按下后退按钮或父活动完成时,释放引用;当父活动被操作系统销毁并打算在以后复活时,它们不会被释放。

答案 2 :(得分:0)

如果要根据每个基础清理片段引用,可以使用此辅助方法进行片段替换

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 中的所有片段扩展您的所有活动。此外,如果您堆叠片段,您应该扩展更多,即 onBackPressed()