Intereting Posts
Выравнивание макета стола Android Удалите отступы Android по умолчанию из электронных писем HTML Объявления Admob не отображаются Состояние гонки при показе и скрытии FAB с AnimationUtils In-app billing андроидная аутентификация возврата требуется при попытке подписаться на продукт Как получить силу сигнала LTE в Android? Android Studio: установка завершилась неудачно, поскольку APK не был подписан Карты api2 animateCamera скорость проблемы Как фильтровать нежелательные пакеты в SDK для Android? Как создать набор тестов для Android, который запускает только определенные тесты в одном или нескольких классах? Сделайте анимацию активности сверху донизу Могу ли я встроить пользовательский шрифт в приложение для Android? Дооснащение getBodyAs () не позволяет проанализировать ошибку сервера Размеры видоискателя Android Выбор одного значения RadioButton и прокрутка назад, удаление выбранного в RecyclerView

Как я могу отслеживать, почему моя деятельность завершена?

контекст

Я один из разработчиков, работающих над довольно большим и очень сложным проектом. Половина проекта написана с помощью JavaScript, а другая половина с Java, более того, около 30% базового продукта поставляется нам предварительно скомпилированным, поэтому мы не можем точно заглянуть внутрь или отладить его.

проблема

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

Вещи, которые я пробовал до сих пор

  1. Установка точки останова при каждом вызове finish (), который я мог найти, ни один из них не вызван
  2. Настройка android: excludeFromRecents = "false" для каждого действия
  3. Удаление андроида: launchMode = "singleTop" из AndroidManifest
  4. Я установил точку останова в методе onDestroy () для второго действия, и я вижу, что метод isFinishing () выполняется до «True», поэтому я знаю, что это не ОС, которая уничтожает активность, но там Не является информацией (насколько я могу видеть), которая бы точно определила меня, какой метод class / property / вызвал вызов метода. В трассировке стека нет ничего полезного. В журналах нет ничего полезного.
  5. Я также пробовал спрашивать людей в моей компании, но ответа пока нет.

Вопрос

Существуют ли какие-либо стратегии для поиска того, что вызвало вызов определенного метода жизненного цикла?

Обновление 1

Благодарим вас за отличные вопросы и помощь в разделе комментариев. Вот диаграмма последовательности, чтобы лучше объяснить, что происходит.

  1. Запуск приложения
  2. Активность A вызывает onCreate ()
  3. Активность A вызывает onResume ()
  4. Я запускаю Activity B
  5. Действие A вызывает onUserLeaveHint ()
  6. Действие A вызывает onPause ()
  7. Действие B вызывает onCreate ()
  8. Действие B вызывает onResume ()
  9. Действие A вызывает onStop ()
  10. Я положил приложение на задний план
  11. Действие B вызывает onUserLeaveHint ()
  12. Действие B вызывает onStop ()
  13. Я возвращаю приложение на передний план
  14. Активность B вызывает onDestroy ()
  15. Активность A вызывает onRestart ()
  16. Активность A вызывает onResume ()

Обновление 2

Вот скриншоты использования памяти

Когда я запускаю приложение Введите описание изображения здесь

Когда я запускаю Activity B

Введите описание изображения здесь

Когда я отправляю приложение на задний план

Введите описание изображения здесь

Когда я вернусь на передний план

Введите описание изображения здесь

Solutions Collecting From Web of "Как я могу отслеживать, почему моя деятельность завершена?"

И решение найдено!

Оказывается, что моя корневая активность имела следующий набор свойств:

android:clearTaskOnLaunch="true" 

Вот цитата из документации :

Android: clearTaskOnLaunch Независимо от того, будут ли удалены все действия из задачи, кроме активности root, всякий раз, когда она перезапускается с главного экрана – «true», если задача всегда урезана до ее корневой активности, а «false» " если не. Значение по умолчанию неверно". Этот атрибут имеет смысл только для действий, которые запускают новую задачу (корневая активность); Он игнорируется для всех других действий в задаче. Когда значение равно «true», каждый раз, когда пользователи снова запускают задачу, они приводятся в свою корневую активность независимо от того, что они в последний раз делали в задаче, и независимо от того, использовали ли они кнопку «Назад» или «Домой», чтобы оставить ее. Когда значение «ложно», в некоторых ситуациях задача может быть очищена от действий (см. Атрибут alwaysRetainTaskState), но не всегда.

Предположим, например, что кто-то запускает активность P с главного экрана, а оттуда переходит к активности Q. Затем пользователь нажимает на Home, а затем возвращается к активности P. Обычно пользователь будет видеть активность Q, так как это то, что они Последние делали в задаче П. Однако, если P установил этот флаг в значение «true», все действия над ним (Q в этом случае) были удалены, когда пользователь нажал «Домой», и задача перешла на задний план. Таким образом, пользователь видит только P, когда возвращается к задаче.

Если этот атрибут и allowTaskReparenting являются «истинными», любые действия, которые могут быть перепориентированы, переносятся в задачу, с которой они имеют сходство; Остальные действия затем отбрасываются, как описано выше.

И вот отличная статья, которая помогла мне найти ее: http://developer.android.com/guide/components/tasks-and-back-stack.html

Не уверен, что это сработает:

 @Override public void finish() { super.finish(); Log.d("derp", "who is calling me?", new RuntimeException()); }