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

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

Например:

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

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

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

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

Ответы [ 7 ]

40 голосов
/ 25 января 2012

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

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

26 голосов
/ 20 февраля 2015

Использование 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?

25 голосов
/ 25 января 2012

Это ваш флаг!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().

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

8 голосов
/ 27 октября 2017

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

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

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

7 голосов
/ 25 января 2012

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

1 голос
/ 13 августа 2014

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

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

Затем на onPause() DesiredActivity

Добавить finish(), Это сработало для меня.

0 голосов
/ 16 июня 2015
Intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK|Intent.FLAG_ACTIVITY_NO_HISTORY);

у меня работает :) 1002 *

...