Я обнаружил ошибку в своем приложении, когда оно запускается с помощью кнопки «Открыть» в приложении Google Play Store (ранее называвшемся Android Market). Кажется, что для его запуска из Play Store используется иное, Intent
чем для запуска из меню значков приложений телефона. Это приводит к запуску нескольких копий одного и того же Activity, которые конфликтуют друг с другом.
Например, если мое приложение состоит из Activity ABC, то эта проблема может привести к стеку ABCA.
Я пробовал использовать android:launchMode="singleTask"
все Activity, чтобы исправить эту проблему, но у него есть нежелательный побочный эффект очистки стека Activity до root, когда я нажимаю кнопку HOME.
Ожидаемое поведение: ABC -> HOME -> И когда приложение будет восстановлено, мне нужно: ABC -> HOME -> ABC
Есть ли хороший способ предотвратить запуск нескольких действий одного типа без возврата к корневому действию при использовании кнопки HOME?
источник
Ответы:
Добавьте это в onCreate, и все будет в порядке:
источник
finish()
то пользователь увидит действие, которое было внизу. Из-за этого вы можете с уверенностью предположить, что существующий экземпляр приложения будет выведен на передний план. Если бы это было не так, у вас было бы несколько экземпляров приложения в отдельных задачах, и создаваемое действие было бы корнем его задачи.Я просто собираюсь объяснить, почему это не удается, и как воспроизвести эту ошибку программно, чтобы вы могли включить ее в свой набор тестов:
Когда вы запускаете приложение через Eclipse или Market App, оно запускается с флагами намерений: FLAG_ACTIVITY_NEW_TASK.
При запуске через лаунчер (домашний) использует флаги: FLAG_ACTIVITY_NEW_TASK | FLAG_ACTIVITY_BROUGHT_TO_FRONT | FLAG_ACTIVITY_RESET_TASK_IF_NEEDED и использует действие « MAIN » и категорию « LAUNCHER ».
Если вы хотите воспроизвести это в тестовом примере, выполните следующие действия:
Затем сделайте все необходимое, чтобы перейти к другому занятию. Для моих целей я просто разместил кнопку, которая запускает другое действие. Затем вернитесь в панель запуска (домой) с помощью:
И смоделируйте запуск через пусковую установку с помощью этого:
Если вы не включили обходной путь isTaskRoot (), это воспроизведет проблему. Мы используем это в нашем автоматическом тестировании, чтобы убедиться, что эта ошибка больше никогда не повторится.
Надеюсь это поможет!
источник
Вы пробовали режим запуска singleTop ?
Вот некоторые описания из http://developer.android.com/guide/topics/manifest/activity-element.html :
источник
Может, в этом проблема ? Или какая-то другая форма той же ошибки?
источник
Я думаю, что в принятом ответе ( Дуэйн Хомик ) есть необработанные случаи:
У вас есть разные дополнения (и в результате дублируются приложения):
Вот решение (SDK_INT> = 11 для уведомлений), которое, как я полагаю, обрабатывает эти случаи, а также уведомления в строке состояния.
Манифест :
Активность пусковой установки :
Сервис :
Уведомление :
источник
Я понимаю, что вопрос не имеет ничего общего с Xamarin Android, но я хотел что-то опубликовать, поскольку нигде больше этого не видел.
Чтобы исправить это в Xamarin Android, я использовал код из @DuaneHomick и добавил в
MainActivity.OnCreate()
. Разница с Xamarin в том, что он должен идти послеXamarin.Forms.Forms.Init(this, bundle);
иLoadApplication(new App());
. Итак, мойOnCreate()
будет выглядеть так:* Изменить: начиная с Android 6.0 вышеуказанного решения недостаточно для определенных ситуаций. Я теперь также установить
LaunchMode
наSingleTask
, который , кажется, сделал все правильно работать еще раз. К сожалению, не уверен, как это может повлиять на другие вещи.источник
У меня была такая же проблема, и я исправил ее, используя следующее решение.
В своей основной деятельности добавьте этот код поверх
onCreate
метода:не забудьте добавить это разрешение в свой манифест.
надеюсь, это поможет вам.
источник
У меня тоже была эта проблема
android:configChanges="mcc|mnc"
- если у вас есть соединение с сотовой связью, см. http://developer.android.com/guide/topics/manifest/activity-element.html#config, какая конфигурация используется при загрузке системы или при открытии, или что-то еще.источник
Попробуйте это решение:
создайте
Application
класс и определите там:Затем в вашем первом (Launcher) Activity,
onCreate
прежде чемsetContentView(...)
добавить это:PS
Controller
это мойApplication
класс.источник
IS_APP_RUNNING
будет равна,true
и ваше приложение немедленно закроется. Это не то, что пользователь может найти забавным.попробуйте использовать режим запуска SingleInstance с параметром affinity, установленным на allowtaskreparenting. Это всегда будет создавать действие в новой задаче, но также разрешит его повторное создание. Проверить dis: Атрибут сходства
источник
Я нашел способ не запускать одни и те же действия, это отлично работает для меня
источник