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

Я обнаружил, что в моем приложении пользователь может быть довольно «вложенным» в различные действия, которые открываются, когда пользователь использует приложение.

Например:

  1. Главное меню
  2. Список объектов
  3. Детали объекта
  4. Редактировать объект
  5. Детали объекта
  6. Сведения о дочернем объекте
  7. Редактировать дочерний объект
  8. Сведения о дочернем объекте

Теперь, когда пользователь нажимает «Назад», он должен дважды просмотреть «Сведения о дочернем объекте» (один и тот же объект, когда он редактируется, он возвращается на подробную страницу), и то же самое происходит для «Сведения о родительском объекте».

Есть ли способ повторно использовать действия, если они уже открыты в стеке, и переупорядочить их на передний план? Единственный способ, который я видел, - это действия с атрибутом launcher. Кажется, я видел singleTask и singleTop.

Если я должен использовать эти два атрибута, singleTask и singleTop, как я должен их использовать? Когда я попытался включить их в приложение, это не имело никакого значения. Мне также нужно установить флаг при запуске намерения с помощью startActivity?


person Cody    schedule 24.01.2012    source источник


Ответы (9)


в свойстве Manifest Activity вы можете указать этот параметр android:launchMode="singleInstance"

Подробнее читайте здесь http://developer.android.com/guide/topics/manifest/activity-element.html

person ud_an    schedule 25.01.2012
comment
Не используйте это, не понимая всех последствий launchMode="singleInstance". На самом деле это не переупорядочивает действия, потому что оно вынуждает действие находиться в отдельной задаче (т. е. оно будет отображаться отдельно от приложения в список недавних приложений). Поэтому, если вы сделаете это для каждого действия в своем приложении, вы увидите каждое из них как отдельные записи в списке последних приложений. По крайней мере, так говорят документы. реальность немного отличается. - person Vicky Chijwani; 27.12.2016
comment
Я рекомендую вместо этого использовать Intent.FLAG_ACTIVITY_REORDER_TO_FRONT (как предлагается в ответе Викрама ниже), хотя это не идеальное решение. - person Vicky Chijwani; 27.12.2016

Это твой флаг! http://developer.android.com/reference/android/content/Intent.html#FLAG_ACTIVITY_REORDER_TO_FRONT

intent.addFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT)

Обратите внимание на «addFlags». Также обратите внимание, что onCreate не будет вызываться в этом действии, когда ему будет доставлено новое намерение. Он будет доставлен через onNewIntent().

Это не гарантирует, что запущен один экземпляр Activity. Чтобы убедиться в этом, проверьте это: http://developer.android.com/guide/topics/manifest/activity-element.html#lmode

person Vikram Bodicherla    schedule 25.01.2012

Использование android:launchMode="singleTask", вероятно, является лучшим подходом, поскольку оно не будет воссоздавать действие, если оно уже запущено. Просто добавьте его в действие в своем AndroidManifest.xml, и все будет готово.

<activity
    android:name=".MyActivity"
    android:label="@string/app_name"
    android:launchMode="singleTask"
    >
    <intent-filter>
        <action android:name="android.intent.action.MAIN" />
        <category android:name="android.intent.category.LAUNCHER" />
    </intent-filter>
 </activity>

Вот еще один вопрос, который может быть полезен: режим запуска Android singleTask или singleInstance?

person Balu    schedule 20.02.2015

Это сработало для меня.

Intent intent = new Intent(this, MyActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT);
startActivity(intent);

Если экземпляр этой Activity уже существует, он будет перемещен на передний план. Если экземпляр НЕ существует, будет создан новый экземпляр.

person Anirban    schedule 27.10.2017

Да, вы можете потребовать создания только одного экземпляра этих действий, но обычно это не рекомендуется. Если вас просто интересует история, взгляните на Intent.FLAG_ACTIVITY_CLEAR_TOP.

person kabuko    schedule 25.01.2012

Добавить флаги намерений как

Intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK|Intent.FLAG_ACTIVITY_CLEAR_TOP); StartActivity(srcActivity.java, DesiredActivity.class);

Затем в onPause() DesiredActivity

Добавьте finish(), это помогло мне.

person P-RAD    schedule 13.08.2014

Я хотел иметь только один экземпляр MainActivity, но когда я добавляю:

launchMode="singleInstance"

в моем манифесте перед всеми действиями моего приложения появляется белый экран, поэтому я удалил код singleInstance из манифеста. Я добавил две общедоступные статические переменные моей MainActivity в класс MainActivity:

public static MainActivity mainActivity_instance = null;
public static MainActivity mainActivity_OldInstance = null;

затем я добавил следующий код в onCreate():

 if(mainActivity_instance != null)//if true, it means there was an instance of mainActivity before and it had to be closed.
        mainActivity_OldInstance = mainActivity_instance;
    mainActivity_instance = this;
 if(mainActivity_OldInstance != null)
        mainActivity_OldInstance.finish();

Как видите, я завершил работу с предыдущим экземпляром MainActivity сразу же после создания нового экземпляра!

person farhad.kargaran    schedule 18.03.2020

в котлине:

fun AppCompatActivity.startSingleActivity(intent: Intent) {
    startActivity(intent.apply {
        flags = Intent.FLAG_ACTIVITY_REORDER_TO_FRONT
    })
}
person LLL    schedule 26.02.2021

Intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK|Intent.FLAG_ACTIVITY_NO_HISTORY);

Меня устраивает :)

person शु-Bham    schedule 16.06.2015