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

<p>предположим, у меня есть приложение, содержащее действия с именами a, b, c, d. теперь рассмотрим, что a был запущен в качестве корневого действия, а b был запущен из a, а c был запущен из b, а d был запущен из c. теперь у меня есть кнопка «удалить» в действии d. если предположим, я нажимаю кнопку «удалить» в действии d, затем действие b и действие c следует удалить из стека истории. при нажатии клавиши «назад» в упражнении d вместо «c» должен отображаться актив «а». я не знаю, как это реализовать. может ли кто-нибудь помочь мне решить эту проблему?</p>

<p>я не уверен, что вы можете напрямую программно удалять действия из истории, но если вы используете <code>startactivityforresult()</code> вместо <code>startactivity()</code>, то в зависимости от возвращаемого значения из вашей деятельности вы можете сразу же <code>finish()</code> выполнить предыдущее действие, чтобы смоделировать желаемое поведение. используя этот метод во всех ваших действиях, вы можете иметь такое поведение каскадного стека действий, чтобы позволить вам перейти от действия d к действию a.</p><p>я знаю, что это не ваша ситуация, но в будущем, если вы знаете, что не хотите, чтобы предшествующий объект оставался перед началом деятельности, вы можете вызвать <code>finish()</code> сразу после <code>startactivity()</code>.</p><p>пожалуйста, смотрите раздел «время жизни нового экрана» в <a href="http://developer.android.com/guide/appendix/faq/commontasks.html">общие задачи и как сделать их в android</a> </p>

<p>я согласен с @rivierakid, но думаю о другом: когда вы нажимаете «удалить», вы устанавливаете пользовательский флаг в true.</p><p>переопределить событие возврата ключа:</p><pre><code>public void onbackpressed() { if (!remove){ super.onbackpressed(); }else{ intent gotoa = new intent((this,activitya.class);); gotoa.addflags(intent.flag\_activity\_clear\_top); startactivity(gotoa); } } </code></pre><p>вы думаете, это делает то, что вы хотите?</p><p>удачи.</p>

<p>rivierakid имеет лучший ответ (и отличный вход), но для полноты я хотел бы отметить, что вы также можете установить флаг flag\_activity\_no\_history в намерении, чтобы вновь запущенное действие не появлялось в истории. см. <a href="http://developer.android.com/reference/android/content/intent.html#flag\_activity\_no\_history">http://developer.android.com/reference/android/content/intent.html#flag\_activity\_no\_history</a> </p>

<p>при запуске приложения. все действия запускаются в одной задаче по умолчанию. таким образом, задний стек выглядит так, как показано ниже.</p><p>задача: a-> b-> c-> d в этом случае вершина заднего стека указывает на «d»</p><p>теперь, если вы хотите, чтобы верхняя точка снова указала на «a» . просто объявите атрибут </p><pre><code>android:launchmode="singletask" </code></pre><p>для действия "a" в вашем androidmanifest.xml</p><p>теперь, когда вы нажимаете «кнопку удаления» в упражнении «d» просто начинайте упражнение как обычно. задний стек очищается от действия "b" и "c", и вы получаете чистое начало от действия "a"</p><p>помните, что это закроет и уничтожит вашу активность d из памяти .\_\_, даже если вы не вызываете <code>finish()</code> явно в «d»</p>

<p>я думаю, что это будет делать то, что вы хотите. в файле манифеста просто добавьте атрибут «nohistory» к действиям «b» и «c», к которым вы не хотите возвращаться после нажатия кнопки «назад» в «d».</p><pre><code> <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> </code></pre>