Intereting Posts
Какие HTML-теги поддерживаются Android TextView? На Android-эмуляторе не осталось места Создание конкретного модуля в исходном коде Android Android AutoCompleteTextView с автоматической фильтрацией пользовательских адаптеров Опция USB Debugging выделена серым цветом Как получить текущее местоположение GPS программно в Android? Показать прогрессDialog в классе фрагментов Разрешение на манифест не работает в Android 6 Есть ли способ проверить приложения Android прямо на телефоне без эмулятора? Внедрение уведомлений о внедрении сервера Android Studio: сборка Gradle не выполняется – выполнение выполнено для задачи: compileDebugAidl ' Как установить метки для оси X и Y в двухстрочной диаграмме с помощью aChartEngine в android? Android update project -path "команда не найдена" Как исправить «SQLiteConnection для gms database», которая была утечка Не удалось получить информацию о подписке из API разработчика Google Play для Android

Приложение теряет способность запоминать свой стек при запуске из другого приложения

Теперь, когда я исследовал это еще больше, я переписываю это, чтобы сделать его более ясным. Если вы ищете дополнительную информацию, некоторые из них доступны в старых редакциях.

Что происходит:

(Это относится к приложению, которое не установило никаких параметров launchMode, и поэтому использует значения по умолчанию)

  1. Вы запускаете приложение с рынка или с установщика. Это запускает основной / основной вид приложения с флагом FLAG_ACTIVITY_NEW_TASK и без категорий. В настоящий момент стек приложений [A]

  2. Затем переходите к следующему действию в приложении. Теперь стек в этой задаче [A> B]

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

  4. Ожидается, что на этом этапе активность B покажет, так как именно там вы остановились. Однако отображается A, а стек задач – [A> B> A]. Второй экземпляр A запускается со следующими флагами: FLAG_ACTIVITY_NEW_TASK, FLAG_ACTIVITY_RESET_IF_NEEDED и FLAG_ACTIVITY_BROUGHT_TO_FRONT. Он также имеет категорию android.intent.category.LAUNCHER.

В этот момент, если вы нажмете клавишу «назад», он вернет вас в B, как это было, когда вы его оставили.

Глядя на документацию, кажется, что FLAG_ACTIVITY_BROUGHT_TO_FRONT должен быть установлен только для действий, которые используют singleTask или singleTop launchModes. Однако это приложение не установило никаких параметров запуска и, следовательно, использует стандартный стандартный запуск launchMode.

Я предполагаю, что это не должно произойти в этом случае?

Я должен также отметить, что, когда он попадает в это странное состояние, это происходит каждый раз, когда приложение запускается с главного экрана или в лотке приложения. Если задача завершена (перезагрузка телефона, принудительное прекращение приложения или попадание назад через весь стек), эта проблема исправит и больше не будет запускать ее неправильно. Это происходит только в том случае, если вы запускаете приложение из установщика или на рынок, а затем пытаетесь запустить его из пусковой установки.

Итак, почему это происходит? Есть ли способ предотвратить это?

Solutions Collecting From Web of "Приложение теряет способность запоминать свой стек при запуске из другого приложения"

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

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

В методе onCreate основной / корневой программы проверьте, имеет ли намерение набор FLAG_ACTIVITY_BROUGHT_TO_FRONT, и если да, завершите вызов (). Затем он выдает дополнительный экземпляр A со стека [A> B> A] становится [A> B] и с точки зрения пользователей он запускает активность, которую они ожидали.

Кажется, это работает во всех моих тестах. Мое единственное беспокойство заключается в том, что если есть какой-то странный случай, когда пусковая установка someones всегда будет отмечать запуск с FLAG_ACTIVITY_BROUGHT_TO_FRONT, даже если приложение еще не было в задаче, и поэтому полностью блокирует их, потому что будет называть finish () и не иметь Все в стеке, чтобы вернуться к.

В соответствии с запросом в комментариях здесь показано, как вы можете проверить, имеет ли намерение определенный флаг:

int flags = intent.getFlags(); boolean hasFlag = flags & Intent.FLAG_ACTIVITY_BROUGHT_TO_FRONT == Intent.FLAG_ACTIVITY_BROUGHT_TO_FRONT; 

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

Переопределение onConfigurationChanged () должно помочь вам сохранить состояние.

http://developer.android.com/reference/android/app/Activity.html

Изменения конфигурации

Если конфигурация устройства (как определено классом Resource.Configuration) изменится, то все, что отображает пользовательский интерфейс, необходимо будет обновить в соответствии с этой конфигурацией. Поскольку Activity является основным механизмом взаимодействия с пользователем, он включает специальную поддержку для обработки изменений конфигурации.

Если вы не укажете иное, изменение конфигурации (например, изменение ориентации экрана, языка, устройств ввода и т. Д.) Приведет к уничтожению текущей активности, выполнению процесса жизненного цикла обычной активности onPause (), onStop () и OnDestroy () в зависимости от ситуации. Если действие было на переднем плане или видимо для пользователя, как только onDestroy () вызывается в этом экземпляре, тогда будет создан новый экземпляр действия с любым сохраненнымInstanceState предыдущего экземпляра, сгенерированным из onSaveInstanceState (Bundle).

Это делается потому, что любой ресурс приложения, включая файлы макета, может изменяться на основе любого значения конфигурации. Таким образом, единственным безопасным способом обработки изменения конфигурации является повторное извлечение всех ресурсов, включая макеты, чертежи и строки. Поскольку действия должны уже знать, как сохранить свое состояние и воссоздать себя из этого состояния, это удобный способ перезапуска активности с новой конфигурацией.

В некоторых особых случаях вы можете обойти перезапуск своей активности на основе одного или нескольких типов изменений конфигурации. Это делается с помощью атрибута android: configChanges в его манифесте. Для любых изменений конфигурации вы говорите, что вы там работаете, вы получите вызов метода onConfigurationChanged (Конфигурация) текущей активности, а не перезапуска. Однако если изменение конфигурации связано с тем, что вы не обрабатываете, активность все равно будет перезапущена, а onConfigurationChanged (Configuration) не будет вызываться. "