2013-05-15 2 views
3

Я где-то читал, что каждый раз, когда вы вызываете startActivity() для перехода на новый экран, вы создаете новый экземпляр этого действия. Это сразу подняло мне красный флаг.Как предотвратить растущий стек активности в android

В поисках способа предотвратить эту проблему я прочитал об использовании FLAG_ACTIVITY_REORDER_TO_FRONT. Однако я немного обеспокоен тем, что этот метод не используется ни в одном из обучающих программ, которые я видел для открытия нового экрана в вашем приложении. Поэтому я думаю, что я могу что-то упустить. Я имею в виду, не всегда ли вы хотите убедиться, что вы не создаете дублирующее действие? не такая ли грандиозная сделка, и не должны ее использовать?

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

Я понимаю, что в некоторых случаях вы открываете экран, делаете что-то, а затем закрываете его с помощью функции finish() и возвращаетесь назад. Но если приложение имеет сложную иерархию уровня 4, и пользователь должен иметь возможность прыгать между экранами?

ответ

2

Я имею в виду не всегда хочется, чтобы убедиться, что вы не создаете дублированный активность

Большую часть времени вы, вероятно, не хотят иметь два экземпляра одного и того же Activity но Я предполагаю, что есть ситуации, когда кто-то может

не такой большой сделки и не должны учебники решить его

Это определенно то, что разработчики Android должны знать и понимать, как использовать. Я бы предположил, что вы не можете увидеть его много в учебниках, потому что большинство из них научит вас основам, чтобы вы начали. Когда разработчик новичок в Android, их, как правило, достаточно, чтобы узнать о структуре. И они обычно показывают вам, как делать несколько экранов (что часто может кому-то понадобиться). Они ожидают, что вы узнаете больше деталей, прочитав документы и используя такие сайты, как SO

Я понимаю, что в некоторых случаях вы открываете экран, делаете что-то, а затем закрываете его с помощью функции finish() и возвращаетесь назад. Но если приложение имеет сложную иерархию уровня 4, и пользователь должен иметь возможность прыгать между экранами?

Да, много раз вы не будете слишком глубоки, потому что чем глубже, тем легче получить «потерянное» чувство. Вот почему мне нравится использовать Activities с Dialog Theme, когда это возможно. Это дает ощущение, что вы фактически не покидаете экран, на котором вы находитесь. Однако это не отвечает на ваш вопрос. Существует множество флагов, которые можно использовать с Intents, чтобы не допустить роста стека. Тот, который вы упомянули, работает, и я также часто использую Intent.FLAG_ACTIVITY_CLEAR_Top, если мне нужно удалить все из Activities из стека и вернуться к одному Activity. Между приложениями, пользователями и разработчиками может быть так много разных ситуаций, что то, как вы переходите и работаете с потоком или навигацией, зависит от того, что вам (действительно, пользователю) необходимо.

Кажется, что вы на правильном пути, задавая эти вопросы. Подумайте о том, что даст пользователю лучший и самый естественный опыт и найдет правильные флаги в Intent Docs для вашей ситуации

Надеюсь, это немного облегчило вам ситуацию.Если вы что-то не поняли, не стесняйтесь спрашивать

1

Я лично считаю, что история назад в Android больше запутана, чем полезная для конечных пользователей. Использование кнопок «назад» часто не может выполнять то, что ожидает пользователь.

Есть несколько вариантов, доступных вам, если вы хотите использовать действия в качестве основной конструкции.

  1. Для деятельности типа технологического процесса (например, форма захвата) начинает первое действие с Intent.FLAG_ACTIVITY_NEW_TASK и в конце использование FLAG_ACTIVITY_CLEAR_TASK

  2. Для деятельности верхнего уровня, которые часто возвращается точка начать свою деятельность с Intent .FLAG_ACTIVITY_CLEAR_TOP. Это в основном проверяет, что активность уже находится где-то в стеке, и если она выталкивает все действия над ней в стеке и возобновляет исходное действие.

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

+1

«если вы хотите использовать действия в качестве основной конструкции» ... Какие существуют другие конструкции? – Siavash

+1

Я просто имел в виду, что для некоторых небольших приложений, где не так много рабочих процессов, проще всего использовать одно основное действие в качестве контейнера для фрагментов и обменивать фрагменты вместо запуска новых действий. Его немного offtopic, хотя и на самом деле не затрагивает проблему op. –

2

Как правило, вы избегаете создания дублирующей активности, а IMHO - это ошибка в системе Android, которую по умолчанию это допускает.

(Иногда вы хотите, чтобы это, например, вы написали деятельности «получить имя файла», и более одного приложения, вероятно, назвать его.)

Вы контролируете создание активности в двух местах: в манифест и флаги намерения, которое его запускает.

В манифесте < активность > тег имеет атрибут android:launchMode, который может быть одним из:

  • "стандарт" по умолчанию. Может создаваться несколько раз, может принадлежать любой задаче и может появляться в любом месте стека. Обычно часть задачи, которая называется startActivity(), если не используется FLAG_ACTIVITY_NEW_TASK. Новый экземпляр класса создается для реагирования на каждое новое намерение.

  • «SingleTop» Идентичный стандарта, за исключением того, что если целевая задача уже есть экземпляр этой деятельности на вершине стека, новый вид деятельности не будет создан. Вместо этого существующая активность получит вызов onNewIntent().

  • «singleTask« Там может быть только один. Это первое действие нового стека и, таким образом, является корнем стека действий. Если есть больше намерений, они будут отправлены на onNewIntent().

  • singleInstance "Идентично для singleTask, за исключением того, что это единственное действие в его стеке. Если он попытается запустить новое действие, новое действие запустит новую задачу. То же, что и FLAG_ACTIVITY_NEW_TASK.

Смежные вопросы