it-swarm-ru.tech

Как очистить конкретную деятельность от истории стека?

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

25
Prasath

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

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

Пожалуйста, смотрите раздел «Время жизни нового экрана» в Общие задачи и Как сделать их в Android

31
RivieraKid

Я согласен с @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);
  }
}

Вы думаете, это делает то, что вы хотите?

Удачи.

21
mdelolmo

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

3
Edward Falk

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

Задача: A-> B-> C-> D В этом случае вершина заднего стека указывает на «D»

Теперь, если вы хотите, чтобы верхняя точка снова указала на «A» . Просто объявите атрибут 

Android:launchMode="singleTask"

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

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

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

1
JaydeepW

Я думаю, что это будет делать то, что вы хотите. В файле манифеста просто добавьте атрибут «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>
0
TeXcode