Android заканчивает предыдущие действия для навигации - PullRequest
5 голосов
/ 14 марта 2012

У меня есть 5 действий (скажем, A,B,C,D и E).Действия с A по D предназначены для установки некоторых данных, так что пользователь может иметь возможность переходить назад и вперед, изменяя что угодно.Активность E, с другой стороны, является сводкой, поэтому пользователю больше не разрешается возвращаться.

Моя идея состоит в том, чтобы завершить все предыдущие действия, когда пользователь достигает E

В настоящее время мои действия A до D не имеют флагов.

Активность E называется так:

Intent I = new Intent(this, SomeClass.class);

I.setFlags( Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP);

startActivity(I);

Я читал вездечто эти флаги должны достичь того, что я пытаюсь сделать, но они этого не делают, когда пользователь переходит к действию E и нажимает кнопку Back, приложение возвращается к действию D.

Есть идеи?Я что-то упустил?Разве это не правильный способ решить эту проблему?

Спасибо за вашу помощь

Ответы [ 5 ]

7 голосов
/ 14 марта 2012

Используйте метод startActivityForResult в каждом из действий A, B, C, D вместо startActivity.И когда пользователь выходит из Деятельности E, обработайте кнопку и установите код результата в намерении.теперь в методе onActivityResult каждого класса A, B, C и D его обрабатывают, закрывают действие и передают результат предыдущему действию.

Вы также можете сделать это, как только пользователь завершит действие D. Когда пользователиперейдите от D к E, вы можете использовать описанный выше метод, чтобы фактически перейти к действию A, а затем открыть упражнение E и завершить упражнение A.

Оба приведенных выше случая дают одинаковый результат с точки зрения пользователей иони не видят промежуточные действия A, B, C, D, если вы не выполняете длительную работу в методе onStart этих действий.

5 голосов
/ 01 ноября 2012

На тот случай, если кому-то понадобится код, предложенный @achie, вот он:

Действия A, B, C, D должны начинать следующую деятельность, подобную этой:

Intent myIntent = new Intent(this, B.class); // Or C/D
startActivityForResult(myIntent, 1);

Кроме того, действия A, B, C, D должны перекрывать:

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
   super.onActivityResult(requestCode, resultCode, data);
   if (resultCode == RESULT_OK && requestCode == 1) {
      setResult(RESULT_OK);
      finish();
   }
}

Тогда E активность должна обрабатывать кнопку возврата:

@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
   if (keyCode == KeyEvent.KEYCODE_BACK) {
      setResult(RESULT_OK);
   }
   return super.onKeyDown(keyCode, event);
}
3 голосов
/ 14 марта 2012

Полагаю, вы пытаетесь написать своего рода мастера:)

Чтобы использовать флаг FLAG_ACTIVITY_CLEAR_TOP, вы должны иметь действие E уже в текущей задаче действий.

Пример:E-> A-> B-> C-> D -> если D запустит E с CLEAR_TOP, у вас в стеке будет только действие E.

FLAG_ACTIVITY_CLEAR_TOP Использование флага CLEAR_TOP для запускадействие Если в стеке уже есть экземпляр вызываемого типа действия, то этот экземпляр выводится на передний план вместо создания нового экземпляра.Кроме того, все действия в стеке, находящиеся поверх этого экземпляра, удаляются из стека.Например, если предположить, что текущим стеком активности является ABCDE, запуск действия типа C очистит задачи D и E от задачи и приведет к стеку ABC.

FLAG_ACTIVITY_SINGLE_TOP (не относится к вашему сценарию) Если экземпляр целевого действия уже находится на вершине стека, новый экземпляр не создается.

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

при запуске действия E используйте этот код:

Intent I = new Intent(this, SomeClass.class);
I.putExtra("finish_all", true);
I.setFlags( Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP);
startActivity(I);
0 голосов
/ 14 марта 2012

Вам необходимо переопределить метод onKeyDown() в Activit E и перехватить событие нажатия клавиши для KEYCODE_BACK (клавиша Назад) и просто return true, чтобы указать, что вы обработали Назад событие.Теперь пользователь не сможет вернуться к предыдущему действию.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...