Активность не вызывая onDestroy () после окончания ()

У меня три вида деятельности, назовем их ОДИН, ДВА и ТРИ. Начиная с активности ONE, нажатие на кнопку запускает активность TWO. Из действия TWO нажатие кнопки запускает операцию THREE.

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

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

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

ОК, вот где это становится очень запутанным …

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

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

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

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

Дальнейшее исследование раскрыло этот камень …

Окружающий вызов finish() в THREE с обработчиком 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 ... */ } 

Не совсем моя идея исправить …

Действие не завершено / уничтожено при нажатии на спину.

использование

  @Override public void onBackPressed() { finish(); } 

Поскольку я не могу комментировать, я напишу здесь.

Я не уверен на 100%, если я последую за тобой, но рядом с вами ты упоминаешь, что

После того, как THREE будет уничтожен (второй раз), TWO открывается, как ожидалось.

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

Я нацелен на то, что, возможно, вы открываете больше примеров того же самого действия, о чем упоминается здесь, если взглянуть на рисунок 3.

Поскольку эта проблема возникает только из onResume () [см. Комментарии], я бы сказал, что это звучит как проблема с сохранением состояния, а не с использованием стека.

Взгляните на этот вопрос со стеком над потоком Сохранение состояния активности Android с помощью Save State State State

Если onPause () вы сохраняете «данные» (я не знаю его тип объекта, как вы уже не сказали), в Bundle, тогда onResume () идите его.

Другой пример, найденный здесь Google, использует SharedPreferences вместо Bundle для достижения того же результата.

В целом это будет означать, что вы можете обрабатывать / предотвращать «данные», являющиеся нулевыми, так как вы можете восстановить их, тем самым сохраняя усилия по уничтожению ТРИ и пытаться возиться со стеком, просто ставьте свои термины, сохраняя рабочий процесс «естественным».

Intereting Posts
Как запустить код Android в REPL Как программно выполнять команды командной строки ffmpeg в android? Отладчик Android Studio выделяет неправильные строки Как решить «Не удалось подключиться» в Google+ для входа в Android? Ответ JSONArray с Volley для Android StartActivityForResult и Intents Дополнительно, кажется, что дополнительные функции не отбрасываются Android uiautomator, чтобы щелкнуть ListView Android: Центрировать изображение Ищет хороший календарь датпикера для Android Как правильно добавлять и удалять контактные пузыри в multiautocompletetextview с помощью токенизатора пространства, такого как gmail, в поле в android Операционная система Android Android ADB Logcat – показывает полный логарифм Android: Как максимизировать ширину PreferenceFragment (или избавиться от поля)? Проблема при создании события календаря с использованием zxing Стратегия лицензирования Android для публикации в Google Play и магазине приложений Amazon