Подтвердить что ты не робот

Как открыть уже открытую деятельность вместо создания новой?

У меня есть два действия с "навигационным меню", в котором есть элементы для запуска Activity1 и Activity2. Например, мы запускаем Activity2 из Activity1, а затем хотим открыть Activity1, нажав "меню навигации", но когда мы это сделаем, мы получим новый экземпляр Activity1 вместо открытого экземпляра exxisting. Как я могу открыть экземпляр Activity1, если он уже существует, и создать новый экземпляр, если нет?

4b9b3361

Ответ 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, которые мы не хотим.

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