Intent.FLAG_ACTIVITY_CLEAR_TOP не удаляет стек активности
Я разрабатываю приложение, в котором я хочу закрыть все приложение при нажатии кнопки. Я знаю, что в андроиде мы не должны думать о закрытии приложения, потому что андроид делает это автоматически из этого Является ли отказ от приложения, на которого нахмурился?. но все же я хочу закрыть свое приложение.
Итак, что я делаю для закрытия приложения, я использую флаг Intent.FLAG_ACTIVITY_CLEAR_TOP
для удаления стека действий.
Intent intent = new Intent(Activity3.this, FinishActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(intent);
finish();
И в onCreate FinishActivity.class
я вызываю this.finish()
, но приложение не закрывается, и предыдущая активность снова открывается.
FinishActivity.class
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
this.finish();
}
Обновление:
Вот сценарий
MainActivity->Activity2->Activity3->FinishActivity
Здесь Activity2
открывается после завершения операции.
Как мне это достичь? Любая идея и предложение будут оценены.
Спасибо и с уважением
Ответы
Ответ 1
Используйте это -
Intent intent = new Intent(Activity3.this, FinishActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_NEW_TASK);
intent.addFlags(Intent.FLAG_ACTIVITY_NO_HISTORY);
startActivity(intent);
finish();
Отредактировано - Новый ответ и будет работать отлично..
просто возьмем пример... сделайте это в соответствии с тем, что нужно вашему проекту -
Я беру три класса Activity A, B и C..и я применил кнопку закрытия в представлении класса C Activity. Если вы хотите, чтобы с помощью кнопки "Назад" вы могли перейти к предыдущей операции и при нажатии закрыть, тогда вы выйдете из приложений. Посмотрите -
public class AActivity extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
Intent i = new Intent(this, B.class);
startActivityForResult(i, 1);
}
@Override
protected void onActivityResult(final int requestCode,
final int resultCode, final Intent intent) {
super.onActivityResult(requestCode, resultCode, intent);
if (resultCode == 5) {
finish();
}
}
}
Возьмите следующую активность класса -
public class B extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.b);
Intent i = new Intent(this, C.class);
startActivityForResult(i, 2);
}
@Override
protected void onActivityResult(final int requestCode,
final int resultCode, final Intent intent) {
super.onActivityResult(requestCode, resultCode, intent);
if (resultCode == 5) {
setResult(5);
finish();
}
}
}
Занять последнее действие -
public class C extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.c);
}
// close button..set by xml view..you can set it by button listener.
public void close(View v) {
setResult(5);
finish();
}
}
Надеюсь, это решит вашу проблему..черами!
Ответ 2
Попробуйте. Это должно очистить ваш стек активности.
Intent i = new Intent(this,MyActivity.class);
i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK);
i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(i);
Ответ 3
Это, наконец, помогло мне в 100% случаев. Я пробовал все флаги автономно, никогда не работал для всех экземпляров кода. Использую все флаги везде, где я хочу эту функциональность, около 5 разных мест, и теперь она работает.
Intent intent = new Intent(actvSignIn.this, actvNearbyPlaces.class);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_NEW_TASK);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK);
startActivity(intent);
finish();
Ответ 4
Из документации для Intent.FLAG_ACTIVITY_CLEAR_TOP
Если установлено, и запущенная деятельность уже запущена в текущей задаче, вместо того, чтобы запускать новый экземпляр этого действия, все остальные действия поверх него будут закрыты, и это намерение будет доставлено в (сейчас сверху) старой деятельности как нового намерения.
Итак, чтобы он работал, ваш FinishActivity
должен быть первым в вашем стеке активности. В любом другом случае это решение не даст вам ничего.
Для этого выполните следующие шаги:
1) Сделайте FinishActivity
в качестве активности запуска.
2) Не указывайте его и не начинайте сначала Activity
вашего приложения непосредственно из onCreate
обратного вызова:
3) Переопределить onRestart
обратный вызов:
Пример кода:
private boolean isNeedToContinue = true;
@Override
protected void onCreate(Bundle arg0) {
super.onCreate(arg0);
}
@Override
protected void onResume() {
super.onResume();
if (isNeedToContinue) {
startActivity(new Intent(this,FirstVisibleActivity.class));
isNeedToContinue = false;
} else {
finish();
}
}
@Override
protected void onRestart() {
super.onRestart();
finish();
isNeedToContinue = false;
}
Я думаю, это все, что вам нужно. Удачи!
Ответ 5
setFlags (Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TOP);
кроме того, что set launchMode для "singleTop" в определении FinishActivity в xml,
переписать методNewIntent, вы можете передать некоторую дополнительную информацию как часть намерения, чтобы завершить свою деятельность в onCreate, завершить ее в onNewIntent метод активности, основанный на некотором сигнале от вызывающей активности или просто закончить его на основе ваших потребностей.
Возможно, у вашей другой деятельности есть разные lauchmodes, почему они не заканчиваются.
Ответ 6
Это сработало для меня:
Intent intent = new Intent(Activity3.this, FinishActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK | Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);
finish();
Ответ 7
Попробуйте этот способ, это для меня работа:
Intent intent = new Intent(Activity3.this, FinishActivity.class);
intent.addFlags(android.content.Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(intent);
finish();
вместо вашего кода
Intent intent = new Intent(Activity3.this, FinishActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(intent);
finish();
Ответ 8
Попробуйте следующее:
Intent intent = new Intent(Activity3.this, FinishActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);
finish();
Ответ 9
В качестве других ответов должно быть выполнено следующее.
Intent intent = new Intent(Activity3.this, FinishActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_NEW_TASK);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK);
Для уровня API < 11, Intent.FLAG_ACTIVITY_CLEAR_TASK
недоступен. Вместо этого я использовал IntentCompat.FLAG_ACTIVITY_CLEAR_TASK
из библиотеки поддержки.
См. IntentCompat
Может помочь кому-то споткнуться.