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

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 открывается после завершения операции.

Как мне это достичь? Любая идея и предложение будут оценены.

Спасибо и с уважением

4b9b3361

Ответ 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

Может помочь кому-то споткнуться.