私の活動では、このイディオムを頻繁に使用します。
_@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を返すかどうか、および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
が表示され、OSが一時的に親アクティビティを破棄します(つまり、参照を解放しないでください):
_onDestroy(): activity = non-null, finishing = false
onDismiss(): activity = null, finishing = n/a
_
フラグメントには isRemoving()
というメソッドがあります。これは、フラグメントがアクティビティから削除されるときにtrueになります。
このフラグメントが現在そのアクティビティから削除されている場合はtrueを返します。これは、アクティビティが終了しているかどうかではなく、アクティビティから削除されている途中かどうかです。
助けてくれてありがとう。これらを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();
}
元の質問に追加したコールバックの動作に基づいて、これは私の目的に役立つと思います。戻るボタンが押されるか、親アクティビティが終了すると、参照が解放されます。親アクティビティが後で復活することを意図してOSによって破壊された場合、それらは解放されません。
フラグメント参照をベースごとにクリーンアップする場合は、このヘルパーメソッドをフラグメント置換に使用できます。
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()