После того, как я столкнулся с той же проблемой (и обнаружил, что вызов removeDialog
из onPause
не работает надежно), я разработал обходной путь, который, кажется, работает (хотя это, по общему признанию, взлом).
Как видно из ссылки grepcode, опубликованной antslava , в методе performRestoreInstanceState
, onRestoreInstanceState
вызывается прямо перед restoreManagedDialogs
и передается тот же экземпляр Bundle savedInstanceState
.
final void performRestoreInstanceState(Bundle savedInstanceState) {
onRestoreInstanceState(savedInstanceState);
restoreManagedDialogs(savedInstanceState);
}
Таким образом, есть возможность изменить Bundle savedInstanceState
, который передается в restoreManagedDialogs
из метода onRestoreInstanceState
.
Чтобы предотвратить восстановление всех управляемых диалогов, можно реализовать onRestoreInstanceState
следующим образом:
// This same variable is defined as private in the Activity class. I need
// access to it, so I redefine it here.
private static final String SAVED_DIALOGS_TAG = "android:savedDialogs";
@Override
protected void onRestoreInstanceState(Bundle savedInstanceState) {
super.onRestoreInstanceState(savedInstanceState);
final Bundle b = savedInstanceState.getBundle(SAVED_DIALOGS_TAG);
if (null != b) {
savedInstanceState.remove(SAVED_DIALOGS_TAG);
}
}
Это приводит к удалению Bundle
, на который ссылается ключ "android:savedDialogs"
, из Bundle savedInstanceState
, что впоследствии приводит к немедленному возвращению вызова к restoreManagedDialogs
, когда он находитчто этот ключ не может быть найден:
private void restoreManagedDialogs(Bundle savedInstanceState) {
final Bundle b = savedInstanceState.getBundle(SAVED_DIALOGS_TAG);
if (b == null) {
return;
}
...
}
Это приведет к тому, что onCreateDialog
не будет вызываться при восстановлении Действия, эффективно «скрывая» любые диалоги, таким образом предотвращая сценарий, в котором нужно возвращать null
с onCreateDialog
с места происшествия.
Это не универсальное решение, но, учитывая мои требования, оно, кажется, отвечает всем требованиям.Рассматривая код в grepcode для нескольких версий платформы (1.6, 2.1, 2.2, 2.2.2 и 4.0.3), выясняется, что это решение должно работать согласованно с учетом этих существующих реализаций.