Нажатие «Закрыть приложение» в диалоговом окне Android ANR закрывает и сразу же перезапускает приложение - PullRequest
0 голосов
/ 27 июня 2018

У меня странная (на мой взгляд) проблема. Мое приложение редко выдает ANR s. Я пытаюсь уменьшить их, где это возможно, и до сих пор добился успеха. Однако, когда диалоговое окно ANR действительно появляется , если я (или любой пользователь) решу закрыть приложение, нажав «закрыть приложение», а не ждать , пока оно не станет отзывчивым, тогда приложение закрывается, но немедленно перезапускается, отображая ту же активность, что и при отображении диалога ANR.

Это хлопотно , потому что когда пользователь обычно запускает мое приложение, существует определенная последовательность действий , которую он / она проходит, каждый отвечает за выполнение некоторых задач, создание некоторые объекты и т. д. Когда приложение автоматически перезапускается, однако, и пользователь оказывается в той же активности, в которой он находился, когда отображалось диалоговое окно ANR, эта последовательность действий не выполнялась, поэтому некоторые требуемые вещи отсутствуют и таким образом мое приложение вылетает . Возможно, объект имеет значение null, значение int имеет неправильное значение, чем должно быть, некоторая строка может быть пустой и т. Д. Точная проблема здесь не важна . Важным является , чтобы приложение не проходило последовательность действий, которую оно обычно выполняет при открытии пользователем, настраивая все те объекты, переменные и т. Д., Которые ему понадобятся позднее, прежде чем выполнять это действие.

С другой стороны, , если мое приложение в любой момент падает, у меня есть UncaughtExceptionHandler, который закрывает мое приложение «чистым способом» . Эквивалент того, как пользователь нажал кнопку «Обзор», а затем закрыл приложение, нажав «x» или проведя пальцем влево / вправо . Таким образом, если пользователь хочет использовать приложение снова, он / она запускает его снова, приложение выполняет последовательность действий, которые он должен, и все работает, как предполагалось. Однако, когда появляется диалоговое окно ANR, я не могу контролировать то, что фактически делает нажатие «Закрыть приложение» ...

Или я могу?

Это правильное поведение диалога ANR или я что-то здесь упускаю? Кто-нибудь еще испытывал это? Можно ли как-нибудь закрыть свое приложение и оставить его закрытым после того, как пользователь выбрал в диалоговом окне пункт «Закрыть приложение»? (Наверное, нет).

Заранее спасибо и, пожалуйста, если я что-то упустил здесь, постарайтесь быть нежным! :)

Ответы [ 3 ]

0 голосов
/ 05 июля 2018

Это зависит от «переднего плана» или «постоянных» аспектов, которые могут присутствовать в вашем приложении. Взгляните на AppErrors.java

handleAppCrashLocked () вызывается перед уничтожением ваших процессов - вы можете увидеть определенные здесь условия, в каких случаях действие / служба будет перезапущено. Проверьте, относится ли это к вам.

Во-вторых, если вы не работаете с AOSP, вы не можете изменить намерение перезапуска, с которым ваше приложение будет перезапущено. Таким образом, ваш единственный вариант - обнаружить, что это восстановление после сбоя, и запустить соответствующий экран. Будет разница в намерениях, которые вы получаете, когда ваше приложение запускается через восстановление после сбоев по сравнению с обычным запуском.

Если вы работаете с AOSP, вы можете следовать по следу из AppErrors.java

0 голосов
/ 06 июля 2018

Я нашел ссылку здесь (https://mobikul.com/auto-restart-application-crashforce-close-android/). Это говорит о том, как вы можете автоматически перезапустить принудительно закрытое приложение. Они предоставили способ обработки этих ошибок, которые не были обнаружены в блоке try catch. Практически я не реализовал это, потому что я не смог создать диалог ANR. : - (

Надеюсь, это поможет!

0 голосов
/ 04 июля 2018

Посмотрите на это

В основном то, что этот парень пытался сделать, - это сделать запись неперехваченных ошибок, как вы сказали в своем посте, что вы не можете их обработать, и используете эти журналы для исправления несоответствий в вашем приложении.

Закрытие приложения, как правило, закрывает приложение и не должно повторно открывать приложение, но это полностью зависит от реализации Dialogs в операционной системе вашего мобильного телефона, некоторые OEM-производители вносят изменения в существующую функциональность, а иногда они портятся.

Вы также можете проверить фильтры намерений в своем Манифесте, чтобы проверить, мешают ли они каким-либо образом или нет.

...