page.title=Back 탐색과 Up 탐색
page.tags="navigation","activity","task","up navigation","back navigation"
page.image=/design/media/navigation_between_siblings_gmail.png
@jd:body

<a class="notice-developers" href="{@docRoot}training/implementing-navigation/index.html">
  <div>
    <h3>개발자 문서</h3>
    <p>효과적인 탐색 구현</p>
  </div>
</a>

<p itemprop="description">일관적인 탐색 기능은 전반적인 사용자 환경에 필수적인 요소입니다. 일관성 없고 예상대로 진행되지 않는 기본 탐색은
사용자에게 많은 실망을 줍니다. Android 3.0에서는
글로벌 탐색 동작에 중요한 변경 사항을 도입했습니다. Back 및 Up 탐색에 대한
가이드라인을 꼼꼼히 따르면 사용자가 예상 가능하고 신뢰할 수 있는 탐색 기능이 탑재된 앱을 만들 수 있습니다.</p>
<p>Android 2.3 이하 버전에서는 앱 내 탐색 기능을 지원하기 위해 시스템의 <em>Back</em> 버튼에
의존했습니다. Android 3.0에서는 작업 모음을 도입함으로써 앱 아이콘 및 왼쪽 방향 캐럿으로 이루어진
2차 탐색 메커니즘인<em>Up</em> 버튼이 추가되었습니다.</p>

<img src="{@docRoot}design/media/navigation_with_back_and_up.png">

<h2 id="up-vs-back">Up과 Back</h2>

<p>Up 버튼은 화면
간의 계층적 관계를 기반으로 앱 내에서 탐색할 때 사용됩니다. 예를 들어, 화면 A에 표시된 항목 목록에서 항목을 선택하면 항목에 대한 세부 정보를 표시하는 화면 B로 이동하게 되는데, 이때
화면 B는 화면 A로
돌아가는 Up 버튼을 제공해야 합니다.</p>
<p>화면이 앱의 최상단에 있는 경우(즉, 앱의 홈인 경우), Up
버튼이 표시되지 않아야 합니다.</p>

<p>시스템의 Back 버튼은 사용자가 최근에 작업한 화면
기록을 역순으로 탐색할 때 사용됩니다. 일반적으로 이 버튼은 앱의 계층 구조가 아닌 화면
간의 일시적인 관계를 기반으로 합니다.</p>

<p>또한, 앞서 본 화면이 현재 화면의 계층적 상위 화면일 경우
Back 버튼을 누르는 것과 Up 버튼을 누르는 것의 결과가 동일하며, 이는 흔하게
발생하는 동작입니다. 하지만 사용자가 앱 내에 머무는 Up 버튼과 달리, Back
버튼을 누르면 홈 화면 또는 다른 앱으로 돌아갈 수 있습니다.</p>

<img src="{@docRoot}design/media/navigation_up_vs_back_gmail.png">

<p>Back 버튼은 화면 간 탐색과 직접적으로 관련 없는 몇 가지 동작도 지원합니다.
</p>
<ul>
<li>부동 창 해제(대화 상자, 팝업)</li>
<li>상황에 맞는 작업 모음 해제 및 선택한 항목에서 강조 표시 제거</li>
<li>화상 키보드(IME) 감추기</li>
</ul>
<h2 id="within-app">앱 내 탐색</h2>

<h4>여러 진입 지점을 통한 화면 탐색</h4>
<p>일부 화면은 앱의 계층 구조 내에서 엄격한 위치를 가지고 있지 않는 경우가 있으며, 이 경우 여러 진입 지점을
통해서 접근할 수 있습니다. 예를 들어 설정 화면은 앱
내의 다른 어떤 화면에서도 접근이 가능합니다. 이러한 경우, Up 버튼을 누르면 Back 버튼과 동일하게
참조하는 화면으로 돌아가게 됩니다.</p>
<h4>화면 내에서 뷰 변경</h4>
<p>화면의 뷰 옵션 변경은 Up 또는 Back 버튼의 동작을 변경하지 않습니다. 이는 화면이 앱 계층 구조 내에서 여전히 동일한 위치에
있고, 어떠한 탐색 기록도 새로 생성되지 않기 때문입니다.</p>
<p>이러한 뷰 변경의 예는 다음과 같습니다.</p>
<ul>
<li>탭 및/또는 좌우 스와이프를 사용하여 뷰 전환하기</li>
<li>드롭다운(겹쳐진 탭이라고도 함)을 사용하여 뷰 전환하기</li>
<li>목록 필터링하기</li>
<li>목록 정렬하기</li>
<li>표시 문자 변경하기(예: 확대/축소)</li>
</ul>
<h4>형제 화면 간 탐색하기</h4>
<p>항목 목록에서 개별 항목의 상세 뷰로의 이동을 앱에서 지원하는 경우, 해당 항목에서 목록의 이전/이후
항목으로 직접 이동할 수 있도록 지원하는 것이 바람직한
경우도 있습니다. 예를 들어 Gmail의 대화에서 왼쪽 또는 오른쪽으로 간단하게 스와이프하여 동일한 받은 편지함에 있는 신규 또는 이전 메일을
볼 수 있습니다. 화면 내에서 뷰를 변경하는 것과 마찬가지로,
탐색은 Up 또는 Back 버튼의 동작을 바꾸지 않습니다.</p>

<img src="{@docRoot}design/media/navigation_between_siblings_gmail.png">

<p>하지만 참조 목록으로 같이
묶여 있지 않은 연관된 상세 뷰 사이를 탐색할 때는 주목할 만한 예외적인 상황이 발생합니다. 예를 들어, Play Store에서
동일한 개발자가 만든 여러 앱 또는 동일한 아티스트의 여러 앨범을 탐색하는 경우가 그렇습니다. 이러한 경우, 링크를 따라갈 때마다
기록이 생성되므로, Back 버튼을 누르면 이전에 본 화면으로 이동합니다. Up 버튼을 누르면 계속해서 이러한 연관된 화면을
거치지 않고 가장 최근에 본 컨테이너 화면으로 이동합니다.</p>

<img src="{@docRoot}design/media/navigation_between_siblings_market1.png">

<p>상세
뷰에 대한 지식을 바탕으로 더욱 스마트한 Up 버튼 동작을 구현할 수 있습니다. 위에서 설명한 Play Store 예를 확장하여 사용자가
마지막으로 본 도서에서 해당 도서를 각색한 영화의 세부 정보 화면으로 이동했다고 가정해 봅니다. 그러한 경우, Up 버튼을 누르면 사용자가 이전에 탐색한 적이 없는
컨테이너(영화)로 이동할 수 있습니다.</p>

<img src="{@docRoot}design/media/navigation_between_siblings_market2.png">

<h2 id="into-your-app">홈 화면 위젯 및 알림을 통한 앱 탐색</h2>

<p>홈 화면 위젯이나 알림을 사용하여 사용자가 앱 계층 구조 내에
있는 화면으로 바로 이동할 수 있게 할 수 있습니다. 예를 들어, Gmail의 받은 편지함 위젯과 새 메시지 알림은
모두 받은 편지함 화면을 건너뛰고 사용자가 해당 메일로 바로 이동할 수 있게 해줍니다.</p>

<p>이러한 두 경우 모두 Up 버튼을 다음과 같이 처리합니다.</p>

<ul>
<li><em>일반적으로 목적지 화면이
앱 내의 특정 화면에서 출발한 경우</em>, Up 버튼은 해당 화면으로 이동해야 합니다.</li>
<li><em>그 외의 경우</em>, Up 버튼은 앱의 최상위("홈") 화면으로 이동해야 합니다.</li>
</ul>

<p>Back 버튼의 경우,
앱의 최상위 화면으로 이동하는 완전한 상위 탐색 경로를 태스크의 백 스택에 삽입하여 탐색을 더욱 예측 가능하게 만들어야 합니다. 이는 앱에 어떻게 진입했는지 잊어버린
사용자가 앱에서 나가기
전에 앱의 최상위 화면으로 이동할 수 있게 해줍니다.</p>

<p>예를 들어 Gmail의 홈 화면 위젯은 메일 작성
화면으로 바로 진입할 수 있는 버튼을 제공합니다. 메일 작성 화면에서 Up 또는
Back 버튼을 누르면 받은 편지함으로 이동하게 되고, 받은 편지함에서 Back 버튼을 누르면 홈으로 돌아가게 됩니다.</p>

<img src="{@docRoot}design/media/navigation_from_outside_back.png">

<h4>간접 알림</h4>

<p>앱이 동시에 다양한 이벤트 정보를 제공해야 하는 경우, 사용자를 틈새 화면(interstitial screen)으로 이동하게 하는
단일 알림을 사용할 수 있습니다. 이 화면은
이러한 이벤트를 요약하고, 사용자가 앱을 세부적으로 탐색할 수 있는 경로를 제공합니다. 이러한 스타일의 알림을
<em>간접 알림</em>이라고 합니다.</p>

<p>기본(직접) 알림과 달리, 간접 알림의
틈새 화면에서 Back 버튼을 누르면 백 스택에 다른 화면이
추가되지 않고 알림이 트리거된 지점으로 사용자를 이동시킵니다. 사용자가
틈새 화면에서 앱으로 들어가면, Up 버튼 및 Back 버튼은 위에서 설명한 바와 같이 틈새 화면으로 돌아가지 않고, 기본 알림과 마찬가지로 앱 내에서
탐색을 수행합니다.</p>

<p>예를 들어 Gmail을 사용 중인 사용자가 캘린더로부터 간접 알림을 받았다고 가정해 봅니다. 해당
알림을 터치하면 틈새 화면이 열립니다. 이 화면에는 다른
여러 이벤트에 대한 알림도 표시됩니다. 틈새 화면에서 Back 버튼을 터치하면 Gmail로 돌아갑니다. 특정
이벤트를 터치하면 사용자를 틈새 화면에서 나오게 하여
해당 이벤트의 세부 정보를 보여주는 완전한 캘린더 앱으로 이동하게 됩니다. 이벤트 세부 정보 화면에서 Up 버튼과 Back 버튼을 누르면 캘린더의 최상위 뷰로 이동하게 됩니다.</p>

<img src="{@docRoot}design/media/navigation_indirect_notification.png">

<h4>팝업 알림</h4>

<p><em>팝업 알림</em>은 알림 창을 거치지 않고 바로 사용자에게
표시되는 알림입니다. <strong>팝업 알림은 시기적절한
응답이 요구되는 경우와 사용자의 컨텍스트를 중단하는 것이 필요한 경우에 한하여</strong> 드물게 사용됩니다. 예를 들어
Talk는 친구가 화상 채팅에 참여하도록 보낸
초대를 사용자에게 알리기 위해 이러한 스타일의 알림을 사용하며, 이 초대는 몇 초 후에 자동으로 만료됩니다.</p>

<p>탐색 동작 측면에서, 팝업 알림은 간접
알림의 틈새 화면 동작을 상당히 많이 따릅니다. Back 버튼을 누르면 팝업 알림이 해제됩니다. 사용자가 팝업을
통해 앱으로 이동하면, Up 및 Back 버튼은 기본 알림의 규칙에 따라 앱 내에서
탐색합니다.</p>

<img src="{@docRoot}design/media/navigation_popup_notification.png">

<h2 id="between-apps">앱 간 탐색</h2>

<p>Android 시스템의 본질적인 강점 중 하나는 앱이 
다른 앱을 실행할 수 있다는 점이며, 이로 인해 사용자는 한 앱에서 다른 앱으로 직접 이동할 수 있습니다. 예를 들어,
사진을 캡처해야 하는 앱은 카메라 앱을 작동시킬 수 있으며, 카메라 앱은 사진을
해당 앱으로 돌려줍니다. 이러한 기능은 개발자와 사용자 모두에게 매우 유용합니다.
왜냐하면 개발자는 쉽게 다른 앱의 코드를 활용할 수 있고, 사용자는 흔히 수행하는 작업을 일관된 환경으로
즐길 수 있기 때문입니다.</p>

<p>앱 간 탐색을 이해하려면 아래에서
설명하는 Android 프레임워크 동작을 알아야 합니다.</p>

<h4>액티비티, 태스크 및 인텐트</h4>

<p>Android에서 <strong>액티비티</strong>는
정보 및 사용자가 수행할 수 있는 모든 관련 작업이 포함된 화면을 정의하는 애플리케이션 구성 요소입니다. 앱은 본인이 직접 생성하는
액티비티와 다른 앱에서 재활용하는 액티비티로 구성되어 있는 액티비티 컬렉션입니다.</p>

<p><strong>태스크</strong>는 사용자가 목적을 달성하기 위해서 따르는 일련의 액티비티입니다. 단일
태스크는 단 한 가지 앱의 액티비티만 사용할 수도 있고,
여러 앱의 액티비티를 사용할 수도 있습니다.</p>

<p><strong>인텐트</strong>는 어떤 앱이 작업을 수행하는 데 다른
앱의 도움을 받고자 한다는 신호를 보내는 메커니즘입니다. 앱의 액티비티는
어떠한 인텐트에 응답을 보낼 수 있는지 알려줄 수 있습니다. "공유하기"와 같이 일반적인 인텐트의 경우, 사용자는 해당 요청을 수행할 수 있는 여러 앱을
설치했을 수도 있습니다.</p>

<h4>예: "공유하기"를 지원하는 앱 간에 탐색하기</h4>

<p>액티비티, 태스크, 인텐트가 어떻게 같이 동작하는지 이해하려면 앱이 어떻게 사용자가 다른 앱을 사용하여 콘텐츠를
공유할 수 있도록 하는지 생각해 보세요. 예를 들어, 홈에서 Play 스토어 앱을 실행하면 새로운 태스크
A가 시작됩니다(아래 그림 참조). Play 스토어에서 탐색하다가 홍보 도서의 세부 정보를
보기 위해 터치하면, 다른 액티비티를 추가하여 태스크를 연장하는 방식으로 사용자는 동일한 태스크에 머물게 됩니다. 공유하기
작업을 트리거하면 공유하기 인텐트를 처리하도록
등록된 액티비티(다양한 앱에서 제공)가 나열된 목록을 보여주는 대화 상자가 표시됩니다.</p>

<img src="{@docRoot}design/media/navigation_between_apps_inward.png">

<p>사용자가 Gmail을 통해 공유하기를 선택할 경우, 새로운 태스크가 생성되는 것이 아니라
태스크 A의 연장으로 Gmail의 메일 작성 액티비티가 추가됩니다. Gmail의 백그라운드에서 실행되는 자체적인 태스크가 있을 경우, 해당 태스크는 아무런
영향도 받지 않습니다.</p>

<p>메일 작성 액티비티에서 메시지를 보내거나 Back 버튼을 터치하면, 사용자는
도서 세부 정보 액티비티로 돌아가게 됩니다. Back 버튼을 연이어 터치하면 Play
Store에서 탐색한 페이지로 되돌아가게 되어 결국에는 홈 화면에 이르게 됩니다.</p>

<img src="{@docRoot}design/media/navigation_between_apps_back.png">

<p>하지만 사용자가 메일 작성 액티비티에서 Up 버튼을 터치하는 것은
Gmail에 남아 있고자 하는 의지를 보이는 것입니다. 따라서, 이 경우 Gmail의 대화 목록 액티비티가 표시되고, 새로운 태스크 B가 생성됩니다. 새로운 태스크는
항상 홈에 기반을 두고 있기 때문에, 대화 목록에서 Back 버튼을 터치하면 홈으로 되돌아가게 됩니다.</p>

<img src="{@docRoot}design/media/navigation_between_apps_up.png">

<p>태스크 A는 백그라운드에 남아 있기 때문에 나중에 돌아올 수 있습니다(예를 들어,
최근 앱 화면을 통해). Gmail에 이미 백그라운드에서 실행 중인 자체적인 태스크가 있을 경우,
해당 태스크는 태스크 B로 대체됩니다. 이전 컨텍스트는 사용자의 새로운 목적에 따라 제거됩니다.</p>

<p>앱 계층 구조 내의 액티비티에서 인텐트를 처리하도록 앱에서 등록하는 경우, Up 탐색을 지정하는 방법에 대한 지침을 확인하려면
<a href="#into-your-app">홈 화면 위젯 및
알림을 통한 앱 탐색</a>을 참조하세요.</p>