Очистка полного стека активности Android на старых SDK (у которых отсутствует FLAG_ACTIVITY_CLEAR_TASK)
Я сделал qui немного чтения и поиска на SO, но не могу найти способ очистить текущий стек активности. Контекст моего приложения - это активность, запущенная фоновым сервисом/уведомлением.
Представьте, что мое приложение позволяет вам организовать список людей. Несколько часов назад вы видели человека X в действии "Просмотр", который теперь является вершиной вашего стека. В какой-то момент в будущем служба запускается, и я вывожу новую активность "Уведомлять" для лица Y. Оттуда вы можете отредактировать подробности пользователя.
Когда вы закончите эту деятельность, было бы запутанным пользовательским интерфейсом, чтобы вытащить стек и в конечном итоге просмотреть человека X. В идеале я хотел бы вернуться к тому, что делал пользователь (электронная почта и т.д.), или по крайней мере, к моему приложению домой.
Я попытался запустить "Уведомлять" с помощью FLAG_ACTIVTY_NEW_TASK
, но, похоже, это не помогает: , когда задача заканчивается, просто возвращается к предыдущей задаче. Я хочу, кажется, Android 3 new FLAG_ACTIVITY_CLEAR_TASK
, которого нет в предыдущих SDK.
Есть ли у кого-нибудь предложение достичь этого?
Ответы
Ответ 1
Если у вас уже есть экземпляр вашего дома приложения, работающего в стеке, при завершении работы Y вы можете начать свое домашнее приложение (используя startActivity()
) с флагом FLAG_ACTIVITY_CLEAR_TOP
. Поскольку это уже в стеке, вместо создания нового экземпляра, это вернет вас к вашему приложению домой и очистит стек поверх него.
Ответ 2
Просто kill'em all!
Вы можете добиться этого, используя BroadcastReceivers
:
- Создайте
BaseActivity
следующим образом:
public class BaseActivity extends GuiceActivity {
private KillReceiver mKillReceiver;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mKillReceiver = new KillReceiver();
registerReceiver(mKillReceiver,
IntentFilter.create("kill", "spartan!!!"));
}
@Override
protected void onDestroy() {
super.onDestroy();
unregisterReceiver(mKillReceiver);
}
private final class KillReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
finish();
}
}
}
- Сделайте ваши действия расширенными
BaseActivity
.
- Всякий раз, когда вы хотите очистить стек:
Intent intent = new Intent("kill");
intent.setType("spartan!!!");
sendBroadcast(intent);
Ответ 3
Возьмите ArrayList и сохраните все объекты деятельности в arraylist в oncreate() каждого действия. Всякий раз, когда вы хотите закончить определенную активность, просто извлеките этот экземпляр активности из arraylist и завершите это.