Надеюсь, кто-нибудь может помочь мне понять, если не решение, хотя бы объяснение поведения.
Эта проблема:
На некоторых устройствах нажатие значка запуска приводит к возобновлению текущей задачи, на других - к запуску первоначального намерения запуска (фактически перезапуска приложения). Почему это происходит?
Деталь:
Когда вы нажимаете «Значок запуска», приложение запускается нормально - то есть, я полагаю, запускается Intent с именем вашего первого Activity
действия android.intent.action.MAIN
и категорией android.intent.category.LAUNCHER
. Однако это не всегда так:
На большинстве устройств, если вы нажмете значок запуска после того, как приложение уже запущено, текущее действие в этом процессе возобновится ( НЕ начальное Activity
). Он возобновляется так же, как если бы вы выбрали его из «Недавних задач» в меню ОС. Это поведение, которое я хочу на всех устройствах.
Однако на выбранных других устройствах происходит другое поведение:
На Motorola Xoom, когда вы нажимаете значок запуска, приложение всегда запускает начальный запуск
Activity
независимо от того, что в данный момент работает. Я предполагаю, что значки запуска всегда запускают намерение «ЗАПУСК».На вкладке Samsung 2, когда вы нажимаете значок программы запуска, если вы только что установили приложение, оно всегда запускает исходное
Activity
(то же, что и Xoom) - однако после перезагрузки устройства после установки значок программы запуска вместо возобновить приложение. Я предполагаю, что эти устройства добавляют «установленные приложения» в таблицу поиска при запуске устройства, что позволяет значкам панели запуска правильно возобновлять выполнение задач?
Я прочитал много ответа , что звук похож на мою проблему , а просто добавление android:alwaysRetainTaskState="true"
или использования launchMode="singleTop"
в Activity
не ответ.
Редактировать:
После последнего запуска этого приложения мы обнаруживаем, что такое поведение стало проявляться на всех устройствах после первого перезапуска. Это кажется мне безумным, но, просматривая процесс перезапуска, я не могу понять, что происходит не так.
источник
finish()
их в тех случаях, когда она начинает сначала,Activity
а не возобновляет их.Ответы:
Поведение, которое вы испытываете, вызвано проблемой, которая существует в некоторых средствах запуска Android начиная с API 1. Подробную информацию об ошибке, а также возможных решениях можно найти здесь: https://code.google.com/p/android/issues/ подробно? id = 2373 .
Это относительно распространенная проблема на устройствах Samsung, а также других производителей, которые используют собственный лаунчер / скин. Я не видел, чтобы проблема возникала на стоковой панели запуска Android.
По сути, приложение на самом деле не перезапускается полностью, но ваша активность запуска запускается и добавляется в верхнюю часть стека активности, когда приложение возобновляет запуск. Вы можете подтвердить, что это так, нажав кнопку «Назад», когда вы возобновите приложение и увидите Активность запуска. Затем вы должны будете перейти в действие, которое вы ожидали увидеть при возобновлении работы приложения.
Обходной путь, который я выбрал для решения этой проблемы, заключается в проверке категории Intent.CATEGORY_LAUNCHER и действия Intent.ACTION_MAIN в намерении, которое запускает начальное действие. Если эти два флага присутствуют, и действие не находится в корне задачи (то есть приложение уже запущено), тогда я вызываю finish () для исходного действия. Это точное решение не может работать для вас, но что-то подобное должно.
Вот что я делаю в onCreate () начальной / стартовой активности:
источник
Этот вопрос по-прежнему актуален в 2016 году. Сегодня тестировщик QA сообщил, что мое приложение перезапускается, а не возобновляет работу со стокового модуля запуска в Android M.
В действительности система добавляла запущенную активность в текущий стек задач , но пользователю показалось, что произошел перезапуск, и они потеряли свою работу. Последовательность была:
Примечание: эта проблема не проявляется для отладочных APK, развернутых через ADB, только в APK, загруженных из Play Store или загруженных сбоку. В последних случаях цель запуска из шага 5 содержала флаг
Intent.FLAG_ACTIVITY_BROUGHT_TO_FRONT
, но не в случаях отладки. Проблема исчезнет, как только приложение будет запущено из панели запуска. Я подозреваю, что Задача засевается с искаженным (точнее, нестандартным) намерением, которое препятствует правильному поведению запуска, пока задача не будет полностью очищена.Я пробовал различные режимы запуска действий , но эти параметры слишком сильно отличаются от стандартного поведения, которого ожидает пользователь: возобновление задачи в действии B. См. Следующее определение ожидаемого поведения в руководстве к Задачам и Back Stack внизу страницы. в разделе «Запуск задачи»:
Я нашел этот ответ релевантным и вставил следующее в метод onCreate моего корневого действия (A), чтобы он возобновился соответствующим образом, когда пользователь открывает приложение.
ОБНОВЛЕНИЕ: переместило это решение с флагов анализа паролей к запросам, если действие находится непосредственно в корне задачи. Флаги намерений сложно предсказать и протестировать с помощью различных способов открытия ОСНОВНОЙ операции (запуск из дома, запуск из кнопки «вверх», запуск из Play Store и т. Д.)
источник
Ага! (tldr; см. заявления жирным шрифтом внизу)
Я нашел проблему ... Я думаю.
Итак, я начну с предположения. Когда вы нажимаете панель запуска, она либо запускает установку по умолчанию,
Activity
либо, еслиTask
запущен предыдущий запуск, выводит его на передний план. Другими словами, если на каком-либо этапе навигации вы создаете новыйTask
иfinish
старый, программа запуска больше не будет возобновлять ваше приложение.Если это предположение верно, я вполне уверен, что это должно быть ошибкой, учитывая, что каждый
Task
находится в одном и том же процессе и является таким же допустимым кандидатом на резюме, как и первый созданный?Моя проблема была исправлена путем удаления этих флагов из пары
Intents
:Хотя совершенно очевидно, что
FLAG_ACTIVITY_NEW_TASK
создает новоеTask
, я не оценил, что вышеупомянутое предположение было в силе. Я посчитал это виновником и удалил его для проверки, и у меня все еще была проблема, поэтому я отменил ее. Тем не менее, у меня все еще были следующие условия:Мой экран-заставка запускал «главное»
Activity
в моем приложении, используя вышеуказанный флаг. В конце концов, если бы я «перезапустил» мое приложение и оноActivity
все еще работало, я бы предпочел сохранить его информацию о состоянии.Вы заметите, что в документации не упоминается о запуске нового
Task
:Итак, у меня была ситуация, описанная ниже:
A
запущенB
сFLAG_ACTIVITY_CLEAR_TOP
,A
заканчивает.B
хочет перезапустить службу, поэтому отправляет пользователя,A
которому назначена логика перезапуска службы и пользовательский интерфейс (без флагов).A
запускаетсяB
с FLAG_ACTIVITY_CLEAR_TOP,A
заканчивается.На этом этапе второй
FLAG_ACTIVITY_CLEAR_TOP
флаг перезапускается,B
который находится в стеке задач. Я предполагаю, что это должно разрушитьTask
и начать новую, вызывая мою проблему, которая является очень сложной ситуацией, если вы спросите меня!Итак, если все мои предположения верны:
Launcher
Возобновляется только изначально созданная задачаFLAG_ACTIVITY_CLEAR_TOP
будет, если он перезапускает только оставшиесяActivity
, также воссоздать новыйTask
источник
У меня была такая же проблема на устройствах Samsung. После долгих поисков ни один из этих ответов не помог мне. Я обнаружил, что в файле AndroidManifest.xml
launchMode
установлено значениеsingleInstance
(android:launchMode="singleInstance"
). УдалениеlaunchMode
атрибута исправило мою проблему.источник
launchMode
ценностей: inthecheesefactory.com/blog/…На моем Cat s60 я включил «Не держать действия» в опциях разработчика, отключив это снова, я смог переключать приложения, не теряя состояния приложений ...
источник
Это решение сработало для меня:
кредит: мне нужно свести к минимуму приложение для Android по нажатию кнопки назад
может работать не на всех устройствах, но успешно создает поведение кнопки «Домой» при нажатии кнопки «Назад», что останавливает действие, а не завершает его.
источник
У меня была такая же проблема, причина была:
(Код Котлина, в MainActivity)
Поэтому при переходе к моей MainActivity из моей LoginActivity я использую это:
При использовании этих флагов мне не нужно иметь onBackPressed () в моей MainActivity, оно естественным образом выйдет из приложения по щелчку назад. А при нажатии кнопки «Домой» и возвращении в приложение оно не перезагружается.
источник
Решение для людей, которые не имеют ни малейшего представления о программировании и испытывают эту проблему в своем телефоне Android. Это происходит в основном из-за обновления версии Android (только мое предположение). После обновления все ваши приложения будут оптимизированы, чтобы использовать меньше батареи. Но это, в свою очередь, замедляет работу вашего устройства.
Как решить
Зайдите в настройки >> Приложения >> настройки приложений (ищите значок настроек в любом месте экрана - он отличается на разных устройствах) >> оптимизация батареи (или аналогичный параметр [введите описание изображения здесь] [1] вкл.) >> переместить все приложения в «неоптимизированном» состоянии (приходится делать 1 на 1 вручную - может быть разрешено / запрещено на некоторых телефонах). Ваше приложение запуска должно быть «неоптимизировано» (в моем случае это средство запуска Zen UI - я думаю, это виновник - вы можете попробовать оптимизировать / не оптимизировать и перезапустить другое приложение, если у вас есть время). Теперь перезагрузите телефон. (нет необходимости сбрасывать данные / безопасный режим или какие-либо проблемы)
Попробуйте многозадачность сейчас. :) Нажатие на значок запуска теперь должно привести к возобновлению текущей задачи. :) Ваше устройство станет Не беспокойтесь о батарее, он все равно будет разряжаться.
источник
Бесценный для ваших пользователей. Идеальное резюме даже после нескольких недель сидения в списке недавно использованных приложений.
Это выглядит как резюме для пользователя, но на самом деле это полноценный старт.
Background: память, используемая приложениями, которые в основном действии не запускали задачу, легко восстановить. ОС может просто перезапустить приложение с исходным пакетом, переданным в onCreate. Однако вы можете добавить исходный пакет в
onSaveInstanceState
чтобы при перезапуске приложения ОС вы могли восстановить состояние экземпляра, и никто не знает, будет ли приложение перезапущено или возобновлено. Взять, к примеру, программу классической карты. Пользователь перемещается в позицию на карте и затем нажимает клавишу возврата. Две недели спустя это картографическое приложение все еще находится в списке последних приложений наряду с Facebook, Pandora и Candy. ОС не только сохраняет название приложения для недавно использованных приложений, но и сохраняет исходный пакет, использованный для запуска приложения. Однако программист закодировалonSaveInstanceState
метод, поэтому оригинальный пакет теперь содержит все материалы и информацию, необходимые для создания приложения, чтобы оно выглядело, как будто оно было возобновлено.Пример: сохраните текущую позицию камеры в onSaveInstanceState, только если приложение выгружено и должно быть перезапущено несколько недель спустя из списка последних приложений.
Примечание: вы также можете использовать
onRestoreInstanceState
метод, но мне легче восстановить экземпляр вonCreate
.Это более чем вероятно, что происходит в вашем приложении. На некоторых устройствах ваше приложение выгружается в свободную память. Да, есть некоторые флаги, которые помогают, но флаги не улавливают каждый нюанс вашего приложения, и флаги не будут поддерживать вас в течение многих недель, как
onSaveInstanceState
будет. Вы должны закодировать идеальное резюме через две недели. Это сложная задача для сложного приложения, но мы позади вас и готовы помочь.Удачи
источник