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

Как очистить конкретную активность от истории стека?

Предположим, что у меня есть приложение, содержащее действия с именами A, B, C, D. Теперь рассмотрим, что A был запущен как корневая активность, и B был запущен из A и C, запущен из B и D, запущен с C. Теперь у меня есть кнопка "Удалить" в действии D. Если предположим, Я нажимаю кнопку "Удалить" в действии D, тогда активность B и активность C следует удалить из стека истории. On Нажатие клавиши возврата из действия D должно отображать activiy A вместо C. Я не знаю, как это реализовать. Может ли кто-нибудь помочь мне решить эту проблему?

4b9b3361

Ответ 1

Я не уверен, что вы можете напрямую программно удалять действия из истории, но если вы используете startActivityForResult() вместо startActivity(), то в зависимости от возвращаемого значения из вашей активности вы можете сразу же finish() предшественника чтобы имитировать поведение, которое вы хотите. Используя этот метод во всех ваших действиях, вы можете иметь такое поведение, каскадируя стек активности, чтобы вы могли перейти от действия D к активности A.

Я знаю, что это не ваша ситуация, но в будущем, если вы знаете, прежде чем начать работу, в которой вы не хотите, чтобы предшественник остался, вы можете вызвать finish() сразу после startActivity().

См. раздел "Время жизни нового экрана" в Общие задачи и способы их работы в Android

Ответ 2

Я согласен с @RivieraKid, но я думаю о другом: Когда вы нажимаете "Удалить", вы устанавливаете для специального флага значение true.

Отменить событие задней клавиши:

public void onBackPressed() {
  if (!remove){
    super.onBackPressed();
  }else{
    Intent goToA = new Intent((this,ActivityA.class););
    goToA.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
    startActivity(goToA);
  }
}

Считаете ли вы, что это делает то, что вы хотите?

Удачи.

Ответ 3

RivieraKid имеет лучший ответ (и классный логин), но для полноты, я хотел бы упомянуть, что вы также можете установить флаг FLAG_ACTIVITY_NO_HISTORY в намерении, чтобы вновь запущенная деятельность не появлялась в истории, См. http://developer.android.com/reference/android/content/Intent.html#FLAG_ACTIVITY_NO_HISTORY

Ответ 4

При запуске приложения. Все действия запускаются по одной и той же задаче по умолчанию. Таким образом, задний стек выглядит так, как показано ниже.

Задача: A- > B- > C- > D в этом случае верхний стек назад указывает на "D"

Теперь, если вы хотите снова сделать TOP-точку "A" . Просто объявите атрибут

android:launchMode="singleTask"

для действия "A" в вашем AndroidManifest.xml

Теперь, когда вы нажимаете кнопку "Удалить" в действии "D" , просто начните свою деятельность, как обычно. Задний стек очищается от активность "B" и "C", и вы получаете чистый старт от действия "A"

Помните, что это закроет и уничтожит вашу активность D из памяти даже если вы не вызываете finish() явно в "D"

Ответ 5

Я думаю, что это будет делать то, что вы хотите. В файле манифеста просто добавьте атрибут "noHistory" в действия "B" и "C", которые вы не хотите пересматривать при нажатии кнопки "Назад" в "D".

    <activity   android:name="com.acme.activityA"></activity>

    <activity   android:name="com.acme.activityB"  
                android:noHistory="true"></activity>

    <activity   android:name="com.acme.activityC"  
                android:noHistory="true"></activity>

    <activity   android:name="com.acme.activityD"></activity>

Ответ 6

Альтернативой является создание класса для доступа к действиям и их закрытия. Пример:

Виды деятельности:

  • act1
  • act2
  • ACT3

Класс управления:

public class ActivitiesControl {

    public static act1 vAct1 = null; 
    public static act2 vAct2 = null;
    public static act3 vAct3 = null;
}

В onCreate каждого действия, которое вы задаете: ActivitiesControl.vAct1 = this;

и onDestroy(): ActivitiesControl.vAct1 = null;

Если вы хотите уничтожить некоторую активность, чтобы удалить ее из истории стека, вы просто вызываете:

ActivitiesContro.vAct1.finish();

Я не знаю, является ли это лучшим методом, но это то, что сработало для меня.