У меня есть три вида деятельности, давайте назовем их ОДИН, ДВА и ТРИ. Начиная с первого действия, нажатие кнопки запускает второе действие. Начиная с действия ДВА, нажатие кнопки запускает действие ТРИ.
Достаточно просто.
Теперь для действия ТРЕТЬЕ требуется немного данных, доступных из приложения (которые могут быть, а могут и не быть). В методе THREE onResume()
выполняется проверка данных, и операция завершается, если ее не существует, например:
@Override
protected void onResume() {
super.onResume();
/* ... get data from app ... */
if (data == null) {
Toast.makeText(this, "Data not found", Toast.LENGTH_SHORT).show();
finish();
return;
}
/* ... other logic ... */
}
Когда data == null
, ТРИ завершается, разрушается и возвращается к ДВА. Все хорошо.
Теперь в ДВОЕ нажатие кнопки возврата вызывает finish()
на ДВУХ, но ДВА никогда не вызывает onDestroy()
. Пользователь возвращается в ОДИН просто отлично, но любое последующее намерение вернуться в ДВУ не работает, и никаких ошибок не выдается. TWO остается в состоянии, в котором он был завершен (и приостановлен), но никогда не уничтожается и в результате не может возобновиться.
Итак, почему ТРИ важны в этом случае? Если я удаляю вызов finish()
в блоке кода выше и полагаюсь на «естественное» окончание ТРИ (с помощью кнопки «назад»), когда пользователь возвращается к ОДНОМУ, ДВЕ было правильно уничтожено.
Хорошо, вот где это действительно сбивает с толку ...
Оставив вызов finish()
на месте, я могу облегчить зависание, запустив THREE непосредственно из ONE, а затем «естественно» завершить его (кнопка «назад»). После уничтожения ТРИ (во второй раз) открывается ДВА, как и ожидалось.
Все, что я прочитал, говорит, что со мной все будет в порядке, звоня по номеру finish()
в onResume()
. Но в этом случае он оставляет что-то в плохом состоянии и мешает мне уничтожить вызывающую активность в дальнейшем.
Идеи? или я вывернул твои мозги наизнанку?
EDIT:
Дальнейшие исследования обнаружили этот камень ...
Окружение вызова finish()
в ТРИ с обработчиком postDelay()
около 500 миллисекунд позволит TWO закрыться, как ожидается. Как это:
@Override
protected void onResume() {
super.onResume();
/* ... get data from app ... */
if (data == null) {
Toast.makeText(this, "Data not found", Toast.LENGTH_SHORT).show();
Handler h = new Handler();
h.postDelayed(new Runnable() {
@Override
public void run() {
finish();
}
}, 500);
return;
}
/* ... other logic ... */
}
Не совсем мое представление об исправлении ...