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


В моем PoC у меня есть некоторые действия, HomeActivity, CreateActivity, SearchActivity, ResultsActivity, ResultDetailsActivity и UpdateActivity.

У меня есть два основных пути навигации: Создать и Поиск.

Навигация для пути Создать выглядит следующим образом: HomeActivityCreateActivity - (при завершении) → HomeActivity

Навигация для Поиск выглядит следующим образом: HomeActivitySearchActivityResultsActivity (ListActivity) → ResultDetailsActivityUpdateActivity - (по завершении) → ResultDetailsActivity (с обновленными данными).

В настоящее время переход на новый Activity осуществляется с помощью метода startActivity(intent). Однако это приводит к открытию нескольких экземпляров каждого Activity.

Я новичок в Android. Может кто-нибудь, пожалуйста, предложите, как я мог бы избежать этого?

Ответы

Ответ 1

Установка следующих флагов может помочь вам решить проблему:

  • Intent.FLAG_ACTIVITY_CLEAR_TOP
  • Intent.FLAG_ACTIVITY_REORDER_TO_FRONT

Ответ 2

В манифесте андроида добавьте в тег <activity> android:launchMode="singleTask"

Для получения полного списка проверьте документацию о деятельности

В вашем манифесте:

    <activity android:name=".YourActivity"
              android:launchMode="singleTask"
              android:label="@string/app_name" />

Примечание: не используйте singleton.

Ответ 3

Используйте флаг Intent, если startActivity:

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

существует много видов флага.

Это будет полезно: андроидный однопользовательский режим

Ответ 4

Лучшей формой управления действиями является использование

startActivityForRestult (Intent, ID)

С помощью этого метода для вызова Activities ваша HomeActivity может управлять результатом для других действий в методе переопределения

    @Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    // TODO Auto-generated method stub
    super.onActivityResult(requestCode, resultCode, data);
}

Вы можете отправить известный результат для разных действий и управлять им. Например:
(Allways with startActivityForResult)

HomeActivity → SearchActivity → ResultsActivity (ListActivity) → ResultDetailsActivity → UpdateActivity - (полностью) → ResultDetailsActivity (с обновленными данными). Нажмите "Возврат" и отправьте SEARCH_fINISHED → UpdateActivity уловить это и отправить тот же результат в методе onActivityResult и закончить() → То же самое с searchActivity → Home

Это тоже может помочь:

Intent.FLAG_ACTIVITY_CLEAR_TOP
Intent.FLAG_ACTIVITY_REORDER_TO_FRONT

http://blog.akquinet.de/2010/04/15/android-activites-and-tasks-series-intent-flags/

Ответ 5

Немногие вещи, чтобы добавить ответ, отправленный JoonSung Kim, измените метод addFlag, который будет бросать "не может разрешить ошибку"

изменить: intent.addFlag(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT);

to: intent.addFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT);

код должен быть:

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

Чтобы предотвратить одновременное изменение нескольких экземпляров одного и того же действия, флаг

from: intent.addFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT);

to: intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);

код должен быть:

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