действие не вызывает onDestroy () после finish ()

У меня есть три занятия, назовем их ОДНО, ВТОРОЕ и ТРИ. Из действия ONE нажатие кнопки запускает действие ВТОРОЕ. Из действия ВТО одно нажатие кнопки запускает действие ТРЕТЬЕ.

Достаточно просто.

Теперь для действия THREE требуется немного данных, доступных из приложения (которые могут быть, а могут и не быть). В методе 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 , ТРИ добивает, уничтожает и возвращается ДВУМУ. Все хорошо. Теперь в TWO нажатие кнопки возврата вызывает finish () на TWO, но TWO никогда не вызывает onDestroy () . Пользователь возвращается к ОДНОМУ в порядке, но любое последующее намерение вернуться к ДВА не работает, и никаких ошибок не возникает. TWO остается в состоянии, в котором он был завершен (и приостановлен), но никогда не уничтожается и в результате не может возобновиться.

Итак, почему в данном случае важны ТРИ? Если я удалю вызов finish () в блоке кода выше и полагаюсь на «естественное» завершение ТРИ (с помощью кнопки возврата), когда пользователь вернется к ОДНОМУ, ДВА будут уничтожены. правильно.

Хорошо, вот где это действительно сбивает с толку ...

Оставив вызов finish () на месте, я могу облегчить зависание, запустив ТРИ прямо из ОДНОГО, а затем «естественно» завершить его (кнопка возврата). После того, как THREE уничтожено (второй раз), TWO открывается, как и ожидалось.

Все, что я читал, говорит о том, что со мной все в порядке, вызывая finish () в onResume () для выполнения операции. Но в этом случае он оставляет что-то в плохом состоянии и не позволяет мне разрушить вызывающую активность по линии.

Идеи? или я вывернул ваши мозги наизнанку?

РЕДАКТИРОВАТЬ:

Дальнейшие исследования обнаружили этот драгоценный камень ...

Окружение 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 ... */
}

Не совсем мое представление об исправлении ...

5
задан artex 3 June 2013 в 11:39
поделиться