Очистка полного стека активности Android на старых SDK (в которых отсутствует FLAG_ACTIVITY_CLEAR_TASK) - PullRequest
12 голосов
/ 01 марта 2011

Я немного поработал над чтением и поиском на SO, но не могу найти способ очистить текущий стек активности . Контекст моего приложения - это действие, запускаемое фоновой службой / уведомлением.

Представьте, что мое приложение позволяет вам организовать список людей. Несколько часов назад вы просматривали персона X в упражнении «Просмотр», которое теперь является вершиной вашего стека. В какой-то момент в будущем служба активируется, и я выскакиваю новое действие «Уведомить» для человек Y . Оттуда вы можете редактировать данные человека Y.

Когда вы закончите это действие, пользователь получит путаницу в стеке и в конечном итоге увидит человека X. В идеале я хотел бы вернуться к тому, что делал пользователь (электронная почта и т. Д.), Или по крайней мере, к дому моего приложения.

Я попытался запустить «Уведомить» с помощью FLAG_ACTIVTY_NEW_TASK, но, похоже, это не помогло: по завершении задачи просто возвращается к предыдущему заданию . То, что я хочу, это новая Android 101 FLAG_ACTIVITY_CLEAR_TASK, которой нет в предыдущих SDK.

У кого-нибудь есть предложение достичь этого?

Ответы [ 3 ]

20 голосов
/ 01 марта 2011

Just 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);

6 голосов
/ 01 марта 2011

Если у вас уже есть экземпляр дома вашего приложения, работающий в стеке, после завершения действия Y вы можете запустить дом вашего приложения (используя startActivity()) с флагом FLAG_ACTIVITY_CLEAR_TOP. Поскольку он уже находится в стеке, вместо создания его нового экземпляра это вернет вас домой к вашему приложению и очистит стек поверх него.

0 голосов
/ 26 марта 2012

Возьмите ArrayList и сохраните все объекты действий в arraylist в oncreate () каждого действия. Всякий раз, когда вы хотите завершить конкретное действие, просто извлеките этот экземпляр действия из массива и завершите его.

...