Очистить задний стек активности

Я начинаю с действия A->B->C->D->E .. когда я иду от D->E, в стеке не должно быть активности, но пользователь может использовать кнопку «Назад» из D и перейти к C (без обновление Activity C, как обычная функция возврата)


person W00di    schedule 14.08.2013    source источник


Ответы (3)


Вы можете добавить BroadcastReceiver ко всем действиям, которые хотите закрыть (A, B, C, D):

public class MyActivity extends Activity {
    private FinishReceiver finishReceiver;
    private static final String ACTION_FINISH = 
           "com.mypackage.MyActivity.ACTION_FINISH";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        finishReceiver= new FinishReceiver();
        registerReceiver(finishReceiver, new IntentFilter(ACTION_FINISH));
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();

        unregisterReceiver(finishReceiver);
    }

    private final class FinishReceiver extends BroadcastReceiver {
        @Override
        public void onReceive(Context context, Intent intent) {
            if (intent.getAction().equals(ACTION_FINISH)) 
                finish();
        }
    }
}

... и закрыть их, позвонив ...

sendBroadcast(new Intent(ACTION_FINISH));

... в действии E. Проверьте этот хороший пример тоже.

person Trinimon    schedule 14.08.2013
comment
вы спасаете жизнь....большое спасибо... - person W00di; 14.08.2013
comment
:) к сожалению, по этому вопросу было слишком много сторонников, хотя он немного отличается от упомянутого дубликата. Приведенное выше решение может показаться слишком большим, однако оно довольно гибкое и мощное :) - person Trinimon; 14.08.2013
comment
Спасибо, что поделились решением. Этот случай определенно отличается, новой активности раньше не было в заднем стеке. - person Roman; 14.01.2014
comment
Это фантастическое решение. Гораздо мощнее и понятнее, чем другие. - person MattCochrane; 09.12.2016

Добавьте флаг FLAG_ACTIVITY_CLEAR_TOP к своему намерению, чтобы очистить стопку других ваших действий, когда вы начинаете свою деятельность E, например:

intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);

затем начните свою деятельность:

startActivity(intent)

Дополнительная информация: Task и BackStack

person Arash GM    schedule 14.08.2013
comment
но это работает только в том случае, если активность уже находится в стеке - person W00di; 14.08.2013
comment
@sabya: пожалуйста, объясните больше о вашей проблеме, это немного неясно - person Arash GM; 14.08.2013
comment
из документов: если установлено, и запускаемое действие уже выполняется в текущей задаче, то вместо запуска нового экземпляра этого действия все остальные действия поверх него будут закрыты, и это намерение будет доставлено в старая активность (теперь сверху) как новое намерение. (см. developer.android.com/reference/android/content/Intent.html< /а>) - person Trinimon; 14.08.2013
comment
@Arash: я начинаю с действия A и перехожу к действию B, затем C, D, затем перехожу к действию E из действия D. Но когда пользователь нажимает кнопку «Назад» из E, в стеке не должно быть никаких действий. - person W00di; 14.08.2013
comment
@sabya: если ваша активность связана с одними и теми же задачами, поэтому этот флаг должен очистить ваш задний стек, просто добавьте этот флаг перед началом последней активности. - person Arash GM; 14.08.2013
comment
@ Араш Я уже сделал это ... это не работает ... если я сделаю ваш метод и начну действие A вместо E, оно будет работать, как вы сказали ... но я этого не хочу. Я хочу, чтобы новое действие E запускалось без истории стека - person W00di; 14.08.2013

Добавьте флаги к своему объекту, это очистит все действия в стеке.

Intent intent = new Intent(getApplicationContext(),MainActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP |  Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);

это правильное решение, чтобы очистить действия, уже находящиеся в стеке.

Надеюсь это поможет..

person mananjani    schedule 14.08.2013
comment
тоже не работает... :( - person W00di; 14.08.2013