Навигация с помощью кнопок "Назад" и "Вверх"

Документация для разработчиков

Обеспечение эффективной навигации

Внутренне непротиворечивая навигация является важнейшей составляющей пользовательского интерфейса. Мало что так раздражает пользователей, как несогласованное или непредсказуемое поведение элементов навигации. В Android 3.0 глобальное поведение навигации претерпело значительные изменения. Тщательное следование инструкциям по применению кнопок "Назад" и "Вверх" сделает навигацию в вашем приложении предсказуемой и надежной с точки зрения пользователей.

В Android 2.3 и в более ранних версиях для навигации внутри приложения использовалась системная кнопка Назад. С появлением панели действий в Android 3.0 стал доступен второй механизм навигации – кнопка Вверх, содержащая значок приложения и левую угловую скобку.

Кнопки "Вверх" и "Назад"

Кнопка "Вверх" используется для навигации внутри приложения по иерархической структуре его экранов. Например, если на экране A отображается некоторый список и при выборе какого-либо элемента открывается экран B (с подробной информацией об этом элементе), то на экране B должна присутствовать кнопка "Вверх" для возврата к экрану A.

Если экран является самым верхним в приложении (то есть главным), он не должен содержать кнопку "Вверх".

Системная кнопка "Назад" используется для навигации в обратном хронологическом порядке среди экранов, недавно открытых пользователем. Такая навигация основана на порядке появления экранов, а не на иерархии приложения.

Если предыдущий экран одновременно является иерархическим родителем текущего, кнопка "Назад" имеет то же действие, что и кнопка "Вверх", — и это случается довольно часто. Однако, в отличие от кнопки "Вверх", гарантирующей, что пользователь остается в приложении, кнопка "Назад" может перевести его на главный экран или даже в другое приложение.

Кроме того, кнопка "Назад" проявляет поведение, не связанное напрямую с навигацией между экранами. Она

  • закрывает перемещаемые окна (диалоговые, всплывающие);
  • закрывает контекстные панели действий и снимает выделение с выделенных элементов;
  • скрывает экранную клавиатуру (IME).

Навигация внутри приложения

Переход на экраны с несколькими точками входа

Некоторые экраны не имеют строгой позиции в иерархии приложения, и на них можно перейти из нескольких точек. Например, на экран настроек можно попасть из любого другого экрана приложения. В таком случае кнопка "Вверх" должна осуществлять возврат на вызвавший экран, т. е. вести себя идентично кнопке "Назад".

Изменение представления содержимого на экране

Изменение параметров представления содержимого на экране не сказывается на поведении кнопок "Вверх" и "Назад", — экран остается на прежнем месте в иерархии приложения, а история навигации не меняется.

Примерами изменения представления являются:

  • переключение представлений с помощью вкладок или жестов прокрутки вправо/влево;
  • переключение представлений с помощью раскрывающихся (или свернутых) вкладок;
  • фильтрация списка;
  • сортировка списка;
  • изменение характеристик отображения (например, масштаба).

Навигация между экранами одного уровня

Когда приложение поддерживает навигацию от списка к подробному представлению одного из его элементов, нередко имеет смысл поддержать навигацию от этого элемента к другому, идущему в списке до или после него. Например, в Gmail можно провести пальцем влево или вправо по переписке, чтобы просмотреть предыдущие или последующие входящие сообщения. Как и в случае изменения представления на экране, такая навигация не меняет поведение кнопок "Вверх" и "Назад".

Однако существует важное исключение из этого правила во время просмотра подробных представлений элементов, не связанных вместе ссылающимся списком, например приложений одного разработчика или альбомов одного исполнителя в Play Store. В этих случаях переход по каждой ссылке создает историю навигации, что заставляет кнопку "Назад" перебирать все ранее просмотренные экраны. Кнопка "Вверх" должна по-прежнему игнорировать эти связанные по смыслу экраны и осуществлять переход на последний просмотренный контейнерный экран.

Разработчик может сделать поведение кнопки "Вверх" еще более интеллектуальным, исходя из своих знаний о структуре подробного представления. Вернемся к примеру с просмотром Play Store. Представьте, что пользователь перешел от информации о книге к информации о ее экранизации. Тогда кнопка "Вверх" могла бы переводить пользователя в контейнер (Фильмы), в котором он еще не был.

Навигация внутрь приложения с помощью уведомлений и виджетов главного экрана

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

В обоих этих случаях реализуйте следующее поведение кнопки "Вверх":

  • Если целевой экран, как правило, достигается из одного конкретного экрана приложения, кнопка "Вверх" должна осуществлять переход на этот экран.
  • В противном случае кнопка "Вверх" должна осуществлять переход на самый верхний (главный) экран приложения.

Что касается кнопки "Назад", необходимо обеспечить более предсказуемую навигацию, вставив в стек переходов назад полный путь навигации вверх к самому верхнему экрану приложения. Это позволит пользователям, забывшим, как они вошли в приложение, перейти к его главному экрану перед выходом из приложения.

Например, виджет главного экрана Gmail имеет кнопку, переводящую пользователя прямо на экран создания сообщений. Кнопки "Вверх" или "Назад" переведут пользователя с этого экрана на экран входящих писем, а оттуда кнопка "Назад" переведет его на главную страницу.

Косвенные уведомления

Когда приложению нужно вывести информацию сразу о нескольких событиях, оно может выдать одно уведомление, направляющее пользователя на промежуточный экран. Этот экран содержит сводку событий и предоставляет пользователю возможность перейти вглубь приложения. Такие уведомления называются косвенными.

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

Например, предположим, что пользователь получил косвенное уведомление от приложения Calendar при открытом приложении Gmail. Если он коснется этого уведомления, откроется промежуточный экран с напоминаниями о нескольких событиях. Касание кнопки "Назад" на промежуточном экране возвратит пользователя в Gmail. Если пользователь коснется конкретного события, он перейдет с промежуточного экрана в приложение Calendar к подробной информации о событии. Оттуда кнопки "Вверх" и "Назад" переведут его на верхний уровень приложения Calendar.

Всплывающие уведомления

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

В отношении навигации всплывающие уведомления ведут себя во многом аналогично промежуточному экрану косвенного уведомления. Кнопка "Назад" удаляет всплывающее уведомление. Если пользователь переходит от всплывающего уведомления к уведомляющему приложению, кнопки "Вверх" и "Назад" действуют, как при стандартных уведомлениях, выполняя навигацию внутри приложения.

Навигация между приложениями

Одним из фундаментальных достоинств системы Android является способность взаимного запуска приложений, что дает пользователю возможность переходить непосредственно из одного приложения в другое. Например, приложение, которому нужно сделать снимок, может активировать приложение Camera, которое передаст фотографию вызвавшему его приложению. Это огромное преимущество как для разработчика, имеющего возможность без проблем воспользоваться кодом других приложений, так и для пользователя, получающего согласованный интерфейс для часто выполняемых действий.

Чтобы разобраться в навигации между приложениями, необходимо понять поведение платформы Android, обсуждаемое ниже.

Действия, задачи и намерения

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

Задача — это последовательность действий, выполняемых пользователем для достижения цели. Отдельная задача может использовать действия, заимствованные у одного или у нескольких различных приложений.

Намерение — это механизм, позволяющий приложению сигнализировать, что ему требуется помощь другого приложения в выполнении некоторого действия. Действия, выполняемые приложением, могут указывать, на какие намерения они готовы отвечать. Для осуществления достаточно распространенных намерений, например "Поделиться", у пользователя может быть установлено несколько приложений, способных выполнить соответствующий запрос.

Пример: навигация между приложениями для поддержки совместного использования ресурсов

Чтобы понять, как действия, задачи и намерения взаимодействуют друг с другом, разберемся, как одно приложение позволяет пользователям поделиться содержимым с помощью другого приложения. Например, при запуске приложения Play Store с главного экрана создается новая задача, Task A (см. рисунок ниже). Когда пользователь выполнит навигацию по Play Store и коснется интересующей его книги, чтобы просмотреть информацию о ней, он остается в той же задаче, расширяя ее с помощью добавленных действий. Запуск действия "Поделиться" выводит перед пользователем диалоговое окно со списком действий (из разных приложений), зарегистрированных для выполнения намерения "Поделиться".

Если пользователь предпочтет поделиться информацией через Gmail, действие "Написать" приложения Gmail добавляется как продолжение задачи Task A, и никакая новая задача не создается. Если в фоновом режиме работает собственная задача Gmail, на нее это никак не повлияет.

Если во время действия "Составление сообщения" пользователь отправит сообщение или коснется кнопки "Назад", он вернется к действию "Просмотр информации о книге". Продолжая нажимать на "Назад", пользователь будет совершать переходы назад в Play Store, пока, наконец, не вернется на главный экран.

Однако, коснувшись кнопки "Вверх" во время действия "Составление сообщения", пользователь выскажет пожелание остаться в приложении Gmail. Откроется экран действия "Переписка" приложения Gmail, и для него будет создана новая задача Task B. Новые задачи всегда имеют корень на главном экране, поэтому касание кнопки "Назад" на экране переписки возвращает пользователя именно туда.

Задача Task A остается в фоновом режиме, и пользователь может вернуться к ней впоследствии (например, с помощью экрана с последними приложениями). Если в фоновом режиме уже работает собственная задача Gmail, она будет замещена задачей Task B. Произойдет отказ от предыдущего контекста ради новой цели пользователя.

Если для обработки намерений ваше приложение зарегистрирует действие, расположенное в глубине своей иерархии, следуйте инструкциям по реализации навигации с помощью кнопки "Вверх", изложенным в разделе Навигация внутрь приложения с помощью виджетов и уведомлений главного экрана.