Деятельность в Android - PullRequest
       2

Деятельность в Android

1 голос
/ 07 января 2012

У меня был довольно простой вопрос относительно активностей в приложении для Android.Я все еще новичок.

В моем текущем приложении для Android у меня есть около 10 видов деятельности.Если один из активистов уже находится далеко в стеке активности, и я хочу открыть его снова, можно ли это вызвать:

Intent iLogin = new Intent (это, Login.class);startActivity (iLogin);

Если все еще немного запутанно, я приведу пример.Приложение запускается с действием 1. Затем пользователь открывает действие 2. Позже он открывает действие 3, чтобы выполнить действие.После выполнения действия я хочу, чтобы пользователь вернулся к занятию 1. Можно ли вызывать код выше?Получает ли он активность из стека или создает новую активность?Если нет, как я могу получить активность из стека?

ОБНОВЛЕНИЕ: Я заинтересован в переработке, а не в создании новых каждый раз.Например, не все действия должны быть созданы новые.Некоторые из них отображают только данные, которые могут обновляться по запросу пользователя.

Ответы [ 4 ]

2 голосов
/ 07 января 2012

Вкратце: нет, ваш фрагмент кода поместит новый экземпляр Login в стек активности. Подробнее о поведении стека активности читайте в статье Задачи и Back Stack на developer.android.com.

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

Рисунок 3:

Figure 3

Возможное решение также приведено там, под Управление задачами . Вы можете добавить флаг в Intent, определяющий, что должен делать Android, если в стеке уже существует действие. Я бы сказал, что FLAG_ACTIVITY_REORDER_TO_FRONT или FLAG_ACTIVITY_CLEAR_TOP может быть тем, что вы ищете, но определенно просмотрите другие варианты, так как может быть тот, который лучше соответствует вашим потребностям.

В качестве альтернативы, если поток в вашем приложении это позволяет, вы можете завершить действие, если пользователь отходит от него. Например, в вашем примере: если пользователь переходит от действия № 2 к занятию № 3, закончите # 2. Нажатие кнопки «Назад» из # 3 приведет к представлению действия № 1, так как тогда оно будет тем, что находится на вершине стека.

1 голос
/ 07 января 2012

Можно ли вызвать код выше? Получает ли он активность от составлять или создавать новую деятельность? Если нет, как я могу получить активность из стека?

Ав. Если вы используете этот код, в стеке создается еще один экземпляр вашего первого действия, и нет, это не нормально ..


ки. Вот ответ на основе приведенного выше примера:

Я предлагаю вам использовать startActivityForResult() для вызова Действия 2 из Действия 1

здесь, действие 2 будет вести себя как под-действие ... вы можете установить Result и вызвать finish() во 2-м действии, когда оно успешно завершит свою задачу ...

но перед finish() добавьте логическое значение, например:

 i.putExtra("passed2nd", true);

это будет означать, что пользователь прошел это 2-е действие

Теперь вы должны переопределить, onActivityResult() в вашем первом занятии,

здесь вы можете проверить код запроса и получить дополнительные логические значения из второго действия.


Теперь важная часть: в зависимости от того, является ли логическое значение истинным или нет, вы можете решить вызвать 3-е действие, используя startActivityForResult() с другим кодом запроса,

Кроме того, в вашем onActivityResult() вы можете снова проверить код запроса и делать то, что вы хотите, когда действие 3 заканчивается

так что теперь контроль вернется к первому действию, когда третье действие завершится успешно

Вот пример для начала.

1 голос
/ 07 января 2012

Полагаю, вы можете попробовать флаг FLAG_ACTIVITY_REORDER_TO_FRONT, используя addFlags() метод Intent.

Это приведет Activity к вершине стека, если он уже существует в стеке, и создаст новый, если он не существует.

0 голосов
/ 07 января 2012

Я предлагаю использовать FLAG_ACTIVITY_CLEAR_TOP

Activity 1 -> Activity 2 -> Activity 3, поэтому после Activity 3 вы хотите вернуться к Activity 1 верно?Я предполагаю, что вы не хотите, чтобы Activity 2 все еще работал, поэтому вы должны использовать FLAG_ACTIVITY_CLEAR_TOP, чтобы все между ними было закрыто

...