在我的活动中,我经常使用这个成语:
@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
答案 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()