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

Android: Как мне избежать запуска активности, которая уже находится в стеке?

Давайте попробуем объяснить мой вопрос: У меня есть приложение и услуга. Приложение запускается с активностью A. Служба отправляет широковещательную передачу, которая позволит приложению запустить Activity B Теперь пользователь начинает активность C.

Теперь служба хочет снова запустить активность B. Но как я могу сообщить ему, что активность все еще находится в стеке, или есть флаг намерения для этого?

Как мне избежать того, что он запустит активность B, потому что он уже находится в стеке?

4b9b3361

Ответ 1

Я думаю, вам нужно сделать свою активность B singleInstance, если она уже создана, вы не хотите создавать снова, то есть режим запуска активность может быть определена в манифесте android:launchMode, который определяет, как будет активизирована деятельность.

в вашем случае используйте android:launchMode="singleInstance"

Ответ 2

Вы можете использовать флаг Intent.FLAG_ACTIVITY_NEW_TASK. Если активность уже запущена, это приведет к тому, что на передний план вместо создания нового действия.

Если вы добавите Intent.FLAG_ACTIVITY_CLEAR_TOP, то все действия после этой операции в стопке будут удалены.

Ответ 3

Если действие будет сверху, если оно уже начато, установите флаг FLAG_ACTIVITY_SINGLE_TOP

intent.setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);
mContext.startActivity(intent);

Ответ 4

Подходы android:launchMode="singleInstance" и просто добавление флагов в Intent не работают для меня. Что работает:

В коде, где начинается активность:

Intent intent = new Intent(activity, ActivityThatHasToBeStarted.class);
intent.setFlags(Intent.FLAG_ACTIVITY_BROUGHT_TO_FRONT);
startActivity(intent);

В ActivityThatHasToBeStarted:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    if ((getIntent().getFlags() & Intent.FLAG_ACTIVITY_BROUGHT_TO_FRONT) != 0) {
        finish();
        return;
    }
    // Code for this creation
}

Ответ 5

Если вам больше не требуется второе действие, лучше закончить его, тогда вы должны сделать это во втором действии после окончания операции:

startActivity(new Intent(this, FirstActivity.class).setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP));
finish();

Ответ 6

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

например:

Intent intent = new Intent(sourceActivity, Target activity);

intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);

startActivity(intent)