1page.title=Навигация с помощью кнопок "Назад" и "Вверх" 2page.tags="navigation","activity","task","up navigation","back navigation" 3page.image=/design/media/navigation_between_siblings_gmail.png 4@jd:body 5 6<a class="notice-developers" href="{@docRoot}training/implementing-navigation/index.html"> 7 <div> 8 <h3>Документация для разработчиков</h3> 9 <p>Обеспечение эффективной навигации</p> 10 </div> 11</a> 12 13<p itemprop="description">Внутренне непротиворечивая навигация является важнейшей составляющей пользовательского интерфейса. Мало что так раздражает 14пользователей, как несогласованное или непредсказуемое поведение элементов навигации. В Android 3.0 15глобальное поведение навигации претерпело значительные изменения. Тщательное следование 16инструкциям по применению кнопок "Назад" и "Вверх" сделает навигацию в вашем приложении предсказуемой и надежной с точки зрения пользователей.</p> 17<p>В Android 2.3 и в более ранних версиях для навигации внутри приложения использовалась системная кнопка <em>Назад</em>. 18 С появлением панели действий в Android 3.0 стал доступен второй механизм 19навигации – кнопка <em>Вверх</em>, содержащая значок приложения и левую угловую скобку.</p> 20 21<img src="{@docRoot}design/media/navigation_with_back_and_up.png"> 22 23<h2 id="up-vs-back">Кнопки "Вверх" и "Назад"</h2> 24 25<p>Кнопка "Вверх" используется для навигации внутри приложения по иерархической структуре его 26экранов. Например, если на экране A отображается некоторый список и при выборе какого-либо элемента открывается 27экран B (с подробной информацией об этом элементе), то на экране B должна присутствовать кнопка "Вверх" 28 для возврата к экрану A.</p> 29<p>Если экран является самым верхним в приложении (то есть главным), он не должен содержать кнопку 30"Вверх".</p> 31 32<p>Системная кнопка "Назад" используется для навигации в обратном хронологическом порядке среди 33экранов, недавно открытых пользователем. Такая навигация основана на порядке появления 34экранов, а не на иерархии приложения.</p> 35 36<p>Если предыдущий экран одновременно является иерархическим родителем текущего, 37кнопка "Назад" имеет то же действие, что и кнопка "Вверх", — и это случается довольно 38часто. Однако, в отличие от кнопки "Вверх", гарантирующей, что пользователь остается в приложении, кнопка "Назад" 39может перевести его на главный экран или даже в другое приложение.</p> 40 41<img src="{@docRoot}design/media/navigation_up_vs_back_gmail.png"> 42 43<p>Кроме того, кнопка "Назад" проявляет поведение, не связанное напрямую с навигацией между экранами. Она 44</p> 45<ul> 46<li>закрывает перемещаемые окна (диалоговые, всплывающие);</li> 47<li>закрывает контекстные панели действий и снимает выделение с выделенных элементов;</li> 48<li>скрывает экранную клавиатуру (IME).</li> 49</ul> 50<h2 id="within-app">Навигация внутри приложения</h2> 51 52<h4>Переход на экраны с несколькими точками входа</h4> 53<p>Некоторые экраны не имеют строгой позиции в иерархии приложения, и на них можно перейти 54из нескольких точек. Например, на экран настроек можно попасть из любого другого экрана 55приложения. В таком случае кнопка "Вверх" должна осуществлять возврат на вызвавший экран, т. е. вести себя 56идентично кнопке "Назад".</p> 57<h4>Изменение представления содержимого на экране</h4> 58<p>Изменение параметров представления содержимого на экране не сказывается на поведении кнопок "Вверх" и "Назад", — экран остается 59на прежнем месте в иерархии приложения, а история навигации не меняется.</p> 60<p>Примерами изменения представления являются:</p> 61<ul> 62<li>переключение представлений с помощью вкладок или жестов прокрутки вправо/влево;</li> 63<li>переключение представлений с помощью раскрывающихся (или свернутых) вкладок;</li> 64<li>фильтрация списка;</li> 65<li>сортировка списка;</li> 66<li>изменение характеристик отображения (например, масштаба).</li> 67</ul> 68<h4>Навигация между экранами одного уровня</h4> 69<p>Когда приложение поддерживает навигацию от списка к подробному представлению одного из его элементов, нередко 70имеет смысл поддержать навигацию от этого элемента к другому, идущему в списке до или 71после него. Например, в Gmail можно провести пальцем влево или вправо по переписке, 72чтобы просмотреть предыдущие или последующие входящие сообщения. Как и в случае изменения представления на экране, такая 73навигация не меняет поведение кнопок "Вверх" и "Назад".</p> 74 75<img src="{@docRoot}design/media/navigation_between_siblings_gmail.png"> 76 77<p>Однако существует важное исключение из этого правила во время просмотра подробных представлений элементов, не связанных 78вместе ссылающимся списком, например приложений 79одного разработчика или альбомов одного исполнителя в Play Store. В этих случаях переход по каждой ссылке создает 80историю навигации, что заставляет кнопку "Назад" перебирать все ранее просмотренные экраны. Кнопка "Вверх" должна по-прежнему 81игнорировать эти связанные по смыслу экраны и осуществлять переход на последний просмотренный контейнерный экран.</p> 82 83<img src="{@docRoot}design/media/navigation_between_siblings_market1.png"> 84 85<p>Разработчик может сделать поведение кнопки "Вверх" еще более интеллектуальным, исходя из своих знаний о структуре подробного 86представления. Вернемся к примеру с просмотром Play Store. Представьте, что пользователь перешел от информации о 87книге к информации о ее экранизации. Тогда кнопка "Вверх" могла бы переводить пользователя в контейнер 88(Фильмы), в котором он еще не был.</p> 89 90<img src="{@docRoot}design/media/navigation_between_siblings_market2.png"> 91 92<h2 id="into-your-app">Навигация внутрь приложения с помощью уведомлений и виджетов главного экрана</h2> 93 94<p>У разработчика также есть возможность использовать уведомления или виджеты главного экрана, чтобы помочь пользователю переходить к экранам, 95расположенным глубоко в иерархической структуре приложения. Например, виджет Inbox приложения Gmail и уведомление о новом сообщении могут 96 перевести пользователя непосредственно к переписке, в обход экрана с входящими сообщениями.</p> 97 98<p>В обоих этих случаях реализуйте следующее поведение кнопки "Вверх":</p> 99 100<ul> 101<li><em>Если целевой экран, как правило, достигается из одного конкретного экрана 102приложения</em>, кнопка "Вверх" должна осуществлять переход на этот экран.</li> 103<li><em>В противном случае</em> кнопка "Вверх" должна осуществлять переход на самый верхний (главный) экран приложения.</li> 104</ul> 105 106<p>Что касается кнопки "Назад", необходимо обеспечить более предсказуемую навигацию, вставив в 107стек переходов назад полный путь навигации вверх к самому верхнему экрану приложения. Это позволит пользователям, 108забывшим, как они вошли в приложение, перейти к его главному экрану перед выходом из 109приложения.</p> 110 111<p>Например, виджет главного экрана Gmail имеет кнопку, переводящую пользователя прямо на экран 112создания сообщений. Кнопки "Вверх" или "Назад" переведут пользователя с этого экрана на экран входящих писем, а оттуда 113кнопка "Назад" переведет его на главную страницу.</p> 114 115<img src="{@docRoot}design/media/navigation_from_outside_back.png"> 116 117<h4>Косвенные уведомления</h4> 118 119<p>Когда приложению нужно вывести информацию сразу о нескольких событиях, оно может выдать 120одно уведомление, направляющее пользователя на промежуточный экран. Этот экран содержит сводку 121событий и предоставляет пользователю возможность перейти вглубь приложения. Такие уведомления 122называются <em>косвенными</em>.</p> 123 124<p>Кнопка "Назад" действует не так, как в случае со стандартными (прямыми) уведомлениями. Нажав ее на промежуточном экране косвенного уведомления, 125пользователь вернется в точку, где было создано уведомление, поскольку 126в стеке обратных переходов не появилось дополнительных экранов. Если пользователь перейдет в приложение с 127промежуточного экрана, поведение кнопок "Вверх" и "Назад" будет таким же, как и при стандартных уведомлениях: 128навигация внутри приложения, а не возврат к промежуточному экрану.</p> 129 130<p>Например, предположим, что пользователь получил косвенное уведомление от приложения Calendar при открытом приложении Gmail. Если он коснется 131этого уведомления, откроется промежуточный экран с напоминаниями о нескольких 132событиях. Касание кнопки "Назад" на промежуточном экране возвратит пользователя в Gmail. Если пользователь коснется конкретного 133события, он перейдет с промежуточного экрана в приложение Calendar к подробной информации о 134событии. Оттуда кнопки "Вверх" и "Назад" переведут его на верхний уровень приложения Calendar.</p> 135 136<img src="{@docRoot}design/media/navigation_indirect_notification.png"> 137 138<h4>Всплывающие уведомления</h4> 139 140<p><em>Всплывающие уведомления</em> появляются непосредственно перед пользователем, 141в обход панели уведомлений. Они используются редко и <strong>должны быть зарезервированы для ситуаций, в которых требуется немедленная 142реакция пользователя, и прерывание его действий оправдано</strong>. Например, 143приложение Talk с помощью таких уведомлений извещает пользователя о поступившем от друга приглашении присоединиться к видеочату, поскольку срок действия этого 144приглашения истекает через несколько секунд.</p> 145 146<p>В отношении навигации всплывающие уведомления ведут себя во многом аналогично промежуточному экрану 147косвенного уведомления. Кнопка "Назад" удаляет всплывающее уведомление. Если пользователь переходит 148от всплывающего уведомления к уведомляющему приложению, кнопки "Вверх" и "Назад" действуют, как при стандартных уведомлениях, 149выполняя навигацию внутри приложения.</p> 150 151<img src="{@docRoot}design/media/navigation_popup_notification.png"> 152 153<h2 id="between-apps">Навигация между приложениями</h2> 154 155<p>Одним из фундаментальных достоинств системы Android является способность взаимного запуска приложений, 156что дает пользователю возможность переходить непосредственно из одного приложения в другое. Например, 157приложение, которому нужно сделать снимок, может активировать приложение Camera, которое передаст фотографию 158вызвавшему его приложению. Это огромное преимущество как для разработчика, имеющего возможность без проблем воспользоваться 159кодом других приложений, так и для пользователя, получающего согласованный интерфейс для часто выполняемых 160действий.</p> 161 162<p>Чтобы разобраться в навигации между приложениями, необходимо понять поведение платформы Android, 163 обсуждаемое ниже.</p> 164 165<h4>Действия, задачи и намерения</h4> 166 167<p><strong>Действие</strong> в Android — это компонент приложения, определяющий экран с 168информацией и все действия, которые при этом может выполнить пользователь. Приложение представляет собой набор 169действий, состоящий как из действий, созданных разработчиком, так и из тех, которые выполняются с помощью других приложений.</p> 170 171<p><strong>Задача</strong> — это последовательность действий, выполняемых пользователем для достижения цели. Отдельная 172задача может использовать действия, заимствованные у одного или у нескольких 173различных приложений.</p> 174 175<p><strong>Намерение</strong> — это механизм, позволяющий приложению сигнализировать, что ему требуется помощь 176другого приложения в выполнении некоторого действия. Действия, выполняемые приложением, могут указывать, на какие намерения 177они готовы отвечать. Для осуществления достаточно распространенных намерений, например "Поделиться", у пользователя может быть установлено несколько приложений, 178 способных выполнить соответствующий запрос.</p> 179 180<h4>Пример: навигация между приложениями для поддержки совместного использования ресурсов</h4> 181 182<p>Чтобы понять, как действия, задачи и намерения взаимодействуют друг с другом, разберемся, как одно приложение позволяет пользователям 183поделиться содержимым с помощью другого приложения. Например, при запуске приложения Play Store с главного экрана создается 184новая задача, Task A (см. рисунок ниже). Когда пользователь выполнит навигацию по Play Store и коснется интересующей его книги, 185чтобы просмотреть информацию о ней, он остается в той же задаче, расширяя ее с помощью добавленных действий. Запуск 186действия "Поделиться" выводит перед пользователем диалоговое окно со списком действий (из разных приложений), 187зарегистрированных для выполнения намерения "Поделиться".</p> 188 189<img src="{@docRoot}design/media/navigation_between_apps_inward.png"> 190 191<p>Если пользователь предпочтет поделиться информацией через Gmail, действие "Написать" приложения Gmail добавляется как продолжение задачи 192Task A, и никакая новая задача не создается. Если в фоновом режиме работает собственная задача Gmail, на нее это никак 193не повлияет.</p> 194 195<p>Если во время действия "Составление сообщения" пользователь отправит сообщение или коснется кнопки "Назад", он вернется к 196 действию "Просмотр информации о книге". Продолжая нажимать на "Назад", пользователь будет совершать переходы назад в Play 197Store, пока, наконец, не вернется на главный экран.</p> 198 199<img src="{@docRoot}design/media/navigation_between_apps_back.png"> 200 201<p>Однако, коснувшись кнопки "Вверх" во время действия "Составление сообщения", пользователь выскажет пожелание остаться в приложении 202Gmail. Откроется экран действия "Переписка" приложения Gmail, и для него будет создана новая задача Task B. Новые задачи 203всегда имеют корень на главном экране, поэтому касание кнопки "Назад" на экране переписки возвращает пользователя именно туда.</p> 204 205<img src="{@docRoot}design/media/navigation_between_apps_up.png"> 206 207<p>Задача Task A остается в фоновом режиме, и пользователь может вернуться к ней впоследствии (например, с помощью 208экрана с последними приложениями). Если в фоновом режиме уже работает собственная задача Gmail, она будет замещена 209задачей Task B. Произойдет отказ от предыдущего контекста ради новой цели пользователя.</p> 210 211<p>Если для обработки намерений ваше приложение зарегистрирует действие, расположенное в глубине своей иерархии, 212следуйте инструкциям по реализации навигации с помощью кнопки "Вверх", изложенным в разделе <a href="#into-your-app">Навигация внутрь приложения с помощью виджетов и 213уведомлений главного экрана</a>.</p> 214