У меня есть два действия с "навигационным меню", в котором есть элементы для запуска Activity1 и Activity2. Например, мы запускаем Activity2 из Activity1, а затем хотим открыть Activity1, нажав "меню навигации", но когда мы это сделаем, мы получим новый экземпляр Activity1 вместо открытого экземпляра exxisting. Как я могу открыть экземпляр Activity1, если он уже существует, и создать новый экземпляр, если нет?
Как открыть уже открытую деятельность вместо создания новой?
Ответ 1
Добавьте FLAG_ACTIVITY_REORDER_TO_FRONT
в свой Intent
, который вы используете с startActivity()
.
Ответ 2
добавьте android:launchMode="singleTop"
в свою деятельность в Manifest.xml
<activity android:name=".myActivity" android:label="@string/app_name"
android:launchMode="singleTop" />
Отметьте этот о разных запусках также помните об этом:
Как показано в таблице выше, стандартом является режим по умолчанию и подходит для большинства видов деятельности. SingleTop также является общим и полезный режим запуска для многих видов деятельности. Другие режимы - singleTask и singleInstance - не подходят для большинства приложений, поскольку они приводят к модели взаимодействия, которая, вероятно, быть незнакомым пользователям и сильно отличается от большинства других приложения
Ответ 3
Установите флаг активности на singleTask
и переопределите onNewIntent(Intent intent)
, чтобы поймать новое намерение.
Ответ 4
Самый полный ответ - использовать android:launchMode="singleTask"
и в зависимости от вашей функциональности переопределить onNewIntent, поскольку он будет вызываться if уже есть экземпляр Activity
с переданным ему новым Intent.
<activity
android:name=".MainActivity"
android:launchMode="singleTask"/>
Почему?
Исходя из вопроса. Существует две операции: Activity1 и Activity2
Мы открываем Activity1, а затем из Activity1 открываем Activity2. Затем внутри Activity2:
Как я могу открыть экземпляр Activity1, если он уже существует и создать новый экземпляр, если нет?
Как указано в AndroidManifestActivity_launchMode для singleTask
Если при запуске этой операции уже запущена задача, которая начинается с этого действия, то вместо запуска нового экземпляра текущая задача выводится на передний план. Существующий экземпляр получит вызов Activity.onNewIntent() с помощью...
Кроме того, в классе намерений, если вы читаете о singleTask launchMode
, он уже использует Intent.FLAG_ACTIVITY_BROUGHT_TO_FRONT
и вручную устанавливает намерение, которое обычно не устанавливается кодом приложения.
Как указано в FLAG_ACTIVITY_BROUGHT_TO_FRONT
int FLAG_ACTIVITY_BROUGHT_TO_FRONT Этот флаг обычно не устанавливается кодом приложения, а устанавливается для вас системой, как описано в документации launchMode для режима singleTask.
Поэтому, используя singleTask launchMode
, вы убедитесь, что есть только один экземпляр вашего приложения, и вам не нужно добавлять флаг FLAG_ACTIVITY_BROUGHT_TO_FRONT
к вашим намерениям в каждом действии, которое вызывает ваш Activity2 как предложено CommonsWare.
Теперь, если мы используем android:launchMode="singleTop"
как weakwire, ссылка он ясно сказал:
"singleTop"... В других обстоятельствах - например, если существующий экземпляр действия "singleTop" находится в целевой задаче, но не в верхней части стека, или если он находится в верхней части стека, но не в целевой задаче - новый экземпляр будет создан и помещен в стек.
Другими словами, в некоторых сценариях мы получим несколько экземпляров Activity1, которые мы не хотим.
В заключение, если вы один из тех, кто любит редактирование ответов, которые ничего не дают для самого ответа, ответьте на некоторые реальные вопросы, если вы действительно хотите увеличить репутацию.