Android: Как мне избежать запуска активности, которая уже находится в стеке?
Давайте попробуем объяснить мой вопрос:
У меня есть приложение и услуга.
Приложение запускается с активностью A.
Служба отправляет широковещательную передачу, которая позволит приложению запустить Activity B
Теперь пользователь начинает активность C.
Теперь служба хочет снова запустить активность B. Но как я могу сообщить ему, что активность все еще находится в стеке, или есть флаг намерения для этого?
Как мне избежать того, что он запустит активность B, потому что он уже находится в стеке?
Ответы
Ответ 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)