blob: 67305a942888ed06d6341f5f71237850026d7f80 [file] [log] [blame]
page.title=다중 지원
page.metaDescription=Android N에서 번에 이상의 앱을 표시하도록 지원.
page.keywords="multi-window", "android N", "split screen", "free-form"
@jd:body
<div id="tb-wrapper">
<div id="tb">
<h2> 문서의 내용</h2>
<ol>
<li><a href="#overview">개요</a></li>
<li><a href="#lifecycle">다중 수명 주기</a></li>
<li><a href="#configuring">앱을 다중
모드로 구성</a></li>
<li><a href="#running">앱을 다중 모드에서 실행</a></li>
<li><a href="#testing">앱의 다중 지원 테스트</a></li>
</ol>
<h2>참고 항목</h2>
<ol>
<li><a class="external-link" href="https://github.com/googlesamples/android-MultiWindowPlayground">다중
플레이그라운드 샘플 앱</a></li>
<li><a class="external-link" href="https://medium.com/google-developers/5-tips-for-preparing-for-multi-window-in-android-n-7bed803dda64">Android N에서 다중 창을 준비하기 위한 5가지 팁</a></li>
</ol>
</div>
</div>
<p>
Android N 이상의 앱을 동시에 표시하기 위한 지원을
추가합니다. 핸드헬드 기기에서 개의 앱을 <em>화면 분할</em> 모드에서
나란히 또는 상하로 실행할 있습니다. TV 기기에서 앱이
<em>PIP(Picture-In-Picture)</em> 모드를 사용하는 경우 사용자가 다른 앱과 상호작용하는
동안에 계속 동영상을 재생할 있습니다.
</p>
<p>
N Preview SDK 앱을 빌드하는 경우, 앱이 다중
표시를 처리하는 방식을 구성할 있습니다. 예를 들어, 액티비티의
최소 허용 치수를 지정할 있습니다. 또한 앱에
대해 다중 표시를 비활성화할 수도 있으며, 경우 시스템은 앱을 전체 화면 모드에서만
표시합니다.
</p>
<h2 id="overview">개요</h2>
<p>
Android N에서는 여러 앱이 동시에 화면을 공유할 있습니다. 예를 들어, 사용자가 화면을 분할하여 왼쪽에서는 웹페이지를
보면서 오른쪽에서는 이메일을 작성할
있습니다. 사용자 환경은 기기에 따라
달라집니다.
</p>
<ul>
<li>Android N에서 실행되는 핸드헬드 기기는 화면 분할
모드를 제공합니다. 모드에서 시스템은 화면을 개의 앱으로 채우고,
앱을 나란히 또는 상하로 표시합니다. 사용자가 앱을 구분하는 분할선을 드래그하여 앱을 다른 앱보다
크게 만들 있습니다.
</li>
<li>Android N 실행하는 Nexus Player에서, 앱이
<a href="picture-in-picture.html">PIP 모드</a>로 배치될 있으므로, 사용자가 검색을
수행하거나 다른 앱과 상호작용하는 중에도 앱이 계속해서 콘텐츠를
표시할 있습니다.
</li>
<li> 기기를 제조하는 업체는 자유형식
모드를 선택할 있으며, 경우 사용자가 액티비티의 크기를 자유롭게 조정할 있습니다. 제조업체가 기능을 활성화하면, 기기는 화면 분할 모드 뿐만
아니라 자유형식 모드를
제공합니다.
</li>
</ul>
<img src="{@docRoot}images/android-7.0/mw-splitscreen.png" alt="" width="650" srcset="{@docRoot}images/android-7.0/mw-splitscreen.png 1x,
{@docRoot}images/android-7.0/mw-splitscreen_2x.png 2x," id="img-split-screen" />
<p class="img-caption">
<strong>그림 1.</strong> 화면 분할 모드에서 나란히 실행 중인 앱.
</p>
<p>
사용자가 다음과 같이 다중 모드로 전환할 있습니다.
</p>
<ul>
<li>사용자가 <a href="{@docRoot}guide/components/recents.html">Overview
화면</a>을 열고 액티비티 제목을 길게 누르면,
액티비티를 화면의 강조 표시된 부분으로 드래그하여
다중 모드에 있습니다.
</li>
<li>사용자가 Overview 버튼을 길게 누르면, 기기가 현재 액티비티를
다중 모드에 두고 Overview 화면을 열며, 화면에서 사용자는 화면을
공유하기 위한 다른 액티비티를 선택할 있습니다.
</li>
</ul>
<p>
사용자는 여러 액티비티가 화면을 공유하는 동안 액티비티에서
다른 액티비티로 데이터를 <a href="{@docRoot}guide/topics/ui/drag-drop.html">드래그 드롭</a>할
있습니다. (이전에는, 사용자가 단일 액티비티 내에서만
데이터를 드래그 드롭할 있었습니다.)
</p>
<h2 id="lifecycle">다중 수명 주기</h2>
<p>
다중 모드는 <a href="{@docRoot}training/basics/activity-lifecycle/index.html">액티비티
수명 주기</a>를 변경하지 않습니다.
</p>
<p>
다중 모드에서는, 사용자가 가장 최근에 상호작용했던 액티비티만
지정된 시간에 활성화됩니다. 액티비티는 <em>최상위</em>로 간주됩니다.
다른 모든 액티비티는 표시되어 있더라도 일시 정지된 상태입니다.
그러나 시스템은 이러한 일시 정지되었지만 표시된 액티비티에게 표시되지
않은 액티비티보다 높은 우선 순위를 부여합니다. 사용자가 일시 정지된 액티비티 하나와 상호작용하면, 해당
액티비티가 재개되고 이전의 최상위 액티비티가 일시
정지됩니다.
</p>
<p class="note">
<strong>참고:</strong> 다중 모드에서는 앱이 일시 정지된 상태에서도 여전히
사용자에게 표시될 있습니다. 앱이 일시 정지된 동안에도 액티비티를
계속해야 하는 경우도 있습니다. 예를 들어, 일시 정지 모드이지만 표시된
동영상 재생 앱은 계속해서 동영상을 보여줘야 합니다. 이러한 이유로, 동영상을
재생하는 액티비티는 {@link android.app.Activity#onPause onPause()} 핸들러에서
동영상을 일시 정지하지 <em>않는</em> 것이 좋습니다.
대신, {@link android.app.Activity#onStop
onStop()}에서 동영상을 일시 정지하고, {@link android.app.Activity#onStart
onStart()}에서 재생을 재개해야 합니다.
</p>
<p>
사용자가 앱을 다중 모드에 놓으면
시스템은, <a href="{@docRoot}guide/topics/resources/runtime-changes.html">런타임 변경 처리</a>에 지정된 대로, 구성 변경을 액티비티에
알려줍니다. 동작은 사용자가 앱의 크기를 조정하거나 앱을
전체 화면 모드로 다시 전환할 때도 발생합니다.
기본적으로, 변경에서 액티비티-수명 주기 관계는 기기 모드가
세로 모드에서 가로 모드로 전환되었음을
시스템이 앱에 알려줄 때와 동일합니다(단순 스왑 대신
기기 치수가 변경되는 경우는 제외). <a href="{@docRoot}guide/topics/resources/runtime-changes.html">런타임 변경 처리</a>에서 설명한
대로, 액티비티 스스로 구성 변경을 처리하거나, 시스템이 액티비티를 소멸시키고
치수로 다시 액티비티를 생성하도록
있습니다.
</p>
<p>
사용자가 창의 크기를 조정하여 한쪽 치수를 크게 만드는
경우, 시스템은 사용자 작업에 맞게 액티비티의 크기를 조정하고 필요한
경우 <a href="{@docRoot}guide/topics/resources/runtime-changes.html">런타임 변경</a>을 수행합니다. 앱이 새로 노출되는 영역에 그릴 지연이 발생하는 경우, 시스템은 {@link
android.R.attr#windowBackground windowBackground} 속성 또는 기본
<code>windowBackgroundFallback</code> 스타일 속성에 의해
지정된 색으로 영역을 임시로 채웁니다.
</p>
<h2 id="configuring">앱을 다중 모드로 구성</h2>
<p>
앱이 Android N 대상으로 하는 경우, 앱의 액티비티가 다중
표시를 지원하는지 여부와 지원 방법을 구성할 있습니다. 매니페스트에서 속성을 설정하여 크기와 레이아웃을 제어할
있습니다.
루트 액티비티의 속성 설정은 작업 스택 내의 모든
액티비티에 적용됩니다. 예를 들어, 루트 액티비티의
<code>android:resizeableActivity</code>가 true 설정된 경우, 작업 스택에 있는 모든 액티비티의
크기를 조정할 있습니다.
</p>
<p class="note">
<strong>참고:</strong> Android N보다 낮은 버전의 SDK 다중 방향 앱을 빌드하는 경우
사용자가 앱을 다중 모드에서 사용하면, 시스템이
앱의 크기를 강제로 조정합니다. 앱이 예상치 못하게 동작할 있음을 사용자에게 경고하는
대화 상자가 표시됩니다. 시스템은 고정
방향 앱의 크기는 조정하지 <em>않습니다</em>. 사용자가
다중 모드 하에서 고정 방향 앱을 열려고 시도하면,
앱이 전체 화면을 차지합니다.
</p>
<h4 id="resizeableActivity">android:resizeableActivity</h4>
<p>
매니페스트의 <code>&lt;activity&gt;</code> 또는
<code>&lt;application&gt;</code> 노드에서 속성을 설정하여 다중
표시를 활성화하거나 비활성화합니다.
</p>
<pre>
android:resizeableActivity=["true" | "false"]
</pre>
<p>
속성을 true 설정하면, 액티비티를 분할 화면 모드와 자유형식
모드로 시작할 있습니다. 속성을 false 설정하면, 액티비티가 다중 모드를 지원하지
않습니다. 값이 false이고 사용자가
다중 모드에서 액티비티를 시작하려고 시도하면, 액티비티가 전체 화면을
차지합니다.
</p>
<p>
앱이 Android N 대상으로 하지만 속성에 값을 지정하지
않은 경우, 속성의 기본값은 true 됩니다.
</p>
<h4 id="supportsPictureInPicture">android:supportsPictureInPicture</h4>
<p>
속성을 매니페스트의 <code>&lt;activity&gt;</code> 노드에 설정하여
액티비티가 PIP 표시를 지원하는지 여부를 나타냅니다. <code>android:resizeableActivity</code>가 false 경우 속성이
무시됩니다.
</p>
<pre>
android:supportsPictureInPicture=["true" | "false"]
</pre>
<h3 id="layout">레이아웃 속성</h3>
<p>
Android N에서 <code>&lt;layout&gt;</code> 매니페스트 요소는
다중 모드에서 액티비티가 동작하는 방식에 영향을 미치는
여러 속성을 지원합니다.
</p>
<dl>
<dt>
<code>android:defaultWidth</code>
</dt>
<dd>
자유형식 모드에서 시작될 액티비티의 기본 너비.
</dd>
<dt>
<code>android:defaultHeight</code>
</dt>
<dd>
자유형식 모드에서 시작될 액티비티의 기본 높이.
</dd>
<dt>
<code>android:gravity</code>
</dt>
<dd>
자유형식 모드에서 시작될 액티비티의 초기 배치. 적당한 값은
{@link android.view.Gravity} 참조를 확인하세요.
</dd>
<dt>
<code>android:minimalHeight</code>, <code>android:minimalWidth</code>
</dt>
<dd>
화면 분할
자유형식 모드에서 액티비티의 최소 높이 최소 너비. 사용자가 화면 분할 모드에서 디바이더를 이동하여 액티비티를
지정된 최소값보다 작게 만드는 경우, 시스템은
액티비티를 사용자가 요청한 크기로 자릅니다.
</dd>
</dl>
<p>
예를 들어, 다음 코드는 액티비티가 자유형식 모드로 표시될
액티비티의 기본 크기와 위치 최소 크기를
지정하는 방법을 보여줍니다.
</p>
<pre>
&lt;activity android:name=".MyActivity"&gt;
&lt;layout android:defaultHeight="500dp"
android:defaultWidth="600dp"
android:gravity="top|end"
android:minimalHeight="450dp"
android:minimalWidth="300dp" /&gt;
&lt;/activity&gt;
</pre>
<h2 id="running">앱을 다중 모드에서 실행</h2>
<p>
Android N에서는 다중 모드에서 실행 가능한 앱을 지원하는 새로운
기능을 제공합니다.
</p>
<h3 id="disabled-features">다중 모드에서 비활성화되는 기능</h3>
<p>
기기가 다중 모드에 있는 경우 일부 기능이 비활성화되거나
무시되는데, 이유는 이들 기능은 기기 화면을 다른 액티비티
또는 앱과 공유하는 액티비티에는 적합하지 않기 때문입니다. 이러한 기능에는 다음이 포함됩니다.
<ul>
<li>일부 <a href="{@docRoot}training/system-ui/index.html">시스템 UI</a>
사용자 지정 옵션이 비활성화됩니다. 예를 들어, 앱이 전체 화면 모드에서 실행되지
않을 경우에는 상태 표시줄을 숨길 없습니다.
</li>
<li>시스템이 <code><a href=
"{@docRoot}guide/topics/manifest/activity-element.html#screen"
>android:screenOrientation</a></code> 속성의 변경을 무시합니다.
</li>
</ul>
<h3 id="change-notification">다중 변경 알림 쿼리</h3>
<p>
다중 표시를 지원하기 위해 다음과 같은 메서드가 {@link android.app.Activity}
클래스에 추가되었습니다. 메서드에 대한 자세한 내용은
<a href="{@docRoot}preview/setup-sdk.html#docs-dl">N Preview SDK
참조</a>를 확인하세요.
</p>
<dl>
<dt>
<code>Activity.isInMultiWindowMode()</code>
</dt>
<dd>
액티비티가 다중 모드에 있는지를 알아내려면 메서드를 호출하세요.
</dd>
<dt>
<code>Activity.isInPictureInPictureMode()</code>
</dt>
<dd>
액티비티가 PIP 모드에 있는지를 알아내려면 메서드를 호출하세요.
<p class="note">
<strong>참고:</strong> PIP 모드는 다중 모드의 특별한
케이스입니다. <code>myActivity.isInPictureInPictureMode()</code>가
true 반환하면 <code>myActivity.isInMultiWindowMode()</code>도
역시 true 반환합니다.
</p>
</dd>
<dt>
<code>Activity.onMultiWindowModeChanged()</code>
</dt>
<dd>
시스템은 액티비티가 다중 모드로 들어가거나
모드에서 나올 때마다 메서드를 호출합니다. 시스템은 액티비티가 다중 모드로
들어갈 때는 true 값을 메서드에 전달하고, 액티비티가 다중 모드에서
나올 때는 false 값을 전달합니다.
</dd>
<dt>
<code>Activity.onPictureInPictureModeChanged()</code>
</dt>
<dd>
시스템은 액티비티가 PIP 모드로 들어가거나
모드에서 나올 때마다 메서드를 호출합니다. 시스템은 액티비티가 PIP 모드로 들어갈 때는
true 값을 메서드에 전달하고, 액티비티가 PIP에서 나올 때는
false 값을 전달합니다.
</dd>
</dl>
<p>
또한 이들 메서드의 {@link android.app.Fragment} 버전이
있습니다(예: <code>Fragment.isInMultiWindowMode()</code>).
</p>
<h3 id="entering-pip">PIP 모드로 들어가기</h3>
<p>
액티비티를 PIP 모드에 두려면, 새로운 메서드인
<code>Activity.enterPictureInPictureMode()</code>를 호출합니다. 기기가 PIP 모드를 지원하지 않으면 메서드는
영향이 없습니다. 자세한 내용은
<a href="picture-in-picture.html">PIP</a> 문서를 참조하세요.
</p>
<h3 id="launch">다중 모드에서 액티비티 시작</h3>
<p>
액티비티를 시작하는 경우, 가능하면 액티비티가 현재
액티비티에 인접하여 표시되어야 함을 시스템에게 알려줄 있습니다. 이를 위해
, 플래그
<code>Intent.FLAG_ACTIVITY_LAUNCH_TO_ADJACENT</code>를 사용합니다. 플래그를 전달하면
다음과 같은 동작이 요청됩니다.
</p>
<ul>
<li>기기가 화면 분할 모드에 있는 경우,
시스템은 시작한 액티비티 옆에 액티비티를 만들려고 시도하므로, 액티비티가
화면을 공유합니다. 시스템이 작업을 수행할 있다고
보장되지는 않지만, 가능하면 액티비티를 인접하게 만듭니다.
</li>
<li>기기가 화면 분할 모드에 있으면, 플래그가 영향을 미치지 않습니다.
</li>
</ul>
<p>
기기가 자유형식 모드에 있고 액티비티를 시작 중인 경우,
<code>ActivityOptions.setLaunchBounds()</code>를 호출하여 액티비티의 치수와 화면 위치를
지정할 있습니다. 기기가 다중 모드에 있지 않으면, 메서드가 영향을
미치지 않습니다.
</p>
<p class="note">
<strong>참고:</strong> 작업 스택 내에서 액티비티를 시작하는 경우,
액티비티는 화면상의 액티비티를 대체하여, 모든 다중 속성을
상속합니다. 액티비티를 다중 모드에서 별도 창으로 시작하려면,
작업 스택에서 액티비티를 시작해야 합니다.
</p>
<h3 id="dnd">드래그 드롭 지원</h3>
<p>
사용자는
액티비티가 화면을 공유하는 동안 액티비티에서 다른 액티비티로 데이터를 <a href="{@docRoot}guide/topics/ui/drag-drop.html">드래그 드롭</a>할
있습니다. (이전에는, 사용자가 단일 액티비티 내에서만 데이터를 드래그 드롭할
있었습니다.) 이러한 이유로, 앱이 현재 지원하지 않는 경우에는 드래그 드롭
기능을 앱에 추가하는 것이 좋습니다.
</p>
<p>
N Preview SDK 간의 드래그 드롭을 지원하기 위해 <a href="{@docRoot}reference/android/view/package-summary.html"><code>android.view</code></a>
패키지를 확장합니다. 다음과 같은 클래스와 메서드에 대한 자세한
내용은, <a href="{@docRoot}preview/setup-sdk.html#docs-dl">N Preview
SDK 참조</a>를 참조하세요.
</p>
<dl>
<dt>
<code>android.view.DropPermissions</code>
</dt>
<dd>
놓기를 수신하는 앱에 부여되는 권한을 지정하기
위한 토큰 객체.
</dd>
<dt>
<code>View.startDragAndDrop()</code>
</dt>
<dd>
{@link android.view.View#startDrag View.startDrag()}의 새 별칭. 액티비티 간의 드래그 앤 드롭을 활성화하려면, 새 플래그
<code>View.DRAG_FLAG_GLOBAL</code>을
전달합니다. 수신자 액티비티에게 URI 권한을
부여해야 하는 경우, 플래그
<code>View.DRAG_FLAG_GLOBAL_URI_READ</code> 또는
<code>View.DRAG_FLAG_GLOBAL_URI_WRITE</code>를 적절하게 전달합니다.
</dd>
<dt>
<code>View.cancelDragAndDrop()</code>
</dt>
<dd>
현재 진행 중인 드래그 작업을 취소합니다. 드래그 작업을 발생시킨
앱에 의해서만 호출될 있습니다.
</dd>
<dt>
<code>View.updateDragShadow()</code>
</dt>
<dd>
현재 진행 중인 드래그 작업의 드래그 그림자를 대체합니다. 드래그 작업을 발생시킨
앱에 의해서만 호출될 있습니다.
</dd>
<dt>
<code>Activity.requestDropPermissions()</code>
</dt>
<dd>
{@link android.view.DragEvent}에 포함된 {@link
android.content.ClipData}로 전달되는 콘텐츠 URI 권한을 요청합니다.
</dd>
</dl>
<h2 id="testing">앱의 다중 지원 테스트</h2>
<p>
앱을 Android N용으로 업데이트하든 안하든 간에,
Android N 실행 중인 기기에서 사용자가 앱을 다중 모드로
시작하려고 시도하는 경우, 앱이 다중 모드에서 어떻게 작동하는지 확인해야 합니다.
</p>
<h3 id="configuring">테스트 기기 구성</h3>
<p>
기기에 Android N 설치하면, 화면 분할 모드가
자동으로 지원됩니다.
</p>
<h3 id="test-non-n">앱이 N Preview SDK 작성되지 않은 경우</h3>
<p>
앱을 N Preview SDK 빌드하지 않았는데 사용자가
앱을 다중 모드에서 사용하려고 시도하는 경우, 앱이 고정 방향을 선언하지
않으면 시스템이 앱의 크기를 강제로 조정합니다.
</p>
<p>
앱이 고정 방향을 선언하지 않은 경우, Android N
실행 중인 기기에서 앱을 시작해야 하며, 앱을 화면 분할 모드에
두도록 시도해야 합니다. 앱의 크기를 강제로 조정하는 경우 사용자 환경이
적절한지 확인하세요.
</p>
<p>
앱이 고정 방향을 선언하는 경우, 앱을 다중 모드에
두도록 시도해야 합니다. 앱이 전체 화면 모드에 남아있는지
확인하세요.
</p>
<h3 id="test-mw">다중 모드를 지원하는 경우</h3>
<p>
N Preview SDK 앱을 작성했는데 다중 지원을 비활성화하지
않은 경우, 화면 분할 자유형식 모드에서 다음과
같은 동작을 확인하세요.
</p>
<ul>
<li>앱을 전체 화면 모드에서 시작한 다음, Overview 버튼을 길게 눌러서
다중 모드로 전환합니다. 앱이 적절히 전환되는지 확인합니다.
</li>
<li>앱을 다중 모드에서 직접 시작하고, 앱이 적절히
시작되는지 확인합니다. 다중 모드에서 앱을 시작하려면, Overview 버튼을
누르고 앱의 제목 표시줄을 길게 누른 다음 화면의 강조 표시된 영역
하나로 제목 표시줄을 끌어서 놓습니다.
</li>
<li>분할선을 끌어서 화면 분할 모드에서 앱의 크기를 조정합니다.
작동 중단 없이 크기가 조정되는지 확인하고, 필요한
UI 요소가 표시되는지 확인합니다.
</li>
<li>앱에 최소 치수를 지정한 경우, 치수 아래로 크기를
조정해 봅니다. 지정된 최소값보다 작게 크기를 조정할
없는지 확인합니다.
</li>
<li>모든 테스트를 통해 앱의 성능이 적절한지 확인합니다. 예를 들어,
크기를 조정한 UI 업데이트하기에 지연이
너무 길지 않은지 확인합니다.
</li>
</ul>
<h4 id="test-checklist">테스트 검사 목록</h4>
<p>
다중 모드에서 앱의 성능을 확인하려면, 다음
작업을 시도해 보세요. 별다른 설명이 없는 한, 화면 분할 다중 모드
에서 모두 이들 작업을 시도해야 합니다.
</p>
<ul>
<li>다중 모드에 들어갔다 나갑니다.
</li>
<li>자신의 앱에서 다른 앱으로 전환하고, 앱이 표시는 되지만
활성화되지 않은 동안에 적절히 동작하는지 확인합니다. 예를 들어, 앱이 동영상을 재생 중인 경우, 사용자가
다른 앱과 상호작용하는 동안에 동영상이 계속 재생되는지
확인합니다.
</li>
<li>화면 분할 모드에서, 분할선을 이동하여 앱을 크거나
작게 만들어 봅니다. 앱을 나란히 또는 상하로 놓은 구성에서 이러한
작업을 시도해 봅니다. 앱의 작동이 중단되지 않는지, 필수 기능이
표시되는지, 그리고 크기 조정 작업이 너무 오래 걸리지 않는지
확인합니다.
</li>
<li>빠르게 연속해서 여러 가지 크기 조정 작업을 수행합니다. 앱의 작동이 중단되거나 메모리가 누수되지
않는지 확인합니다. 앱의 메모리 사용량을 확인하는
방법에 대해서는 <a href="{@docRoot}tools/debugging/debugging-memory.html">RAM 사용량
검사</a>를 참조하세요.
</li>
<li>여러 가지 다른 구성에서 앱을 정상적으로
사용하고, 앱이 제대로 작동하는지 확인합니다. 텍스트를 읽을 있는지 확인하고, 해당
UI 요소가 상호작용하기에 너무 작지 않은지 확인합니다.
</li>
</ul>
<h3 id="test-disabled-mw">다중 지원을 비활성화한 경우</h3>
<p>
<code>android:resizableActivity="false"</code>를 설정하여
다중 지원을 비활성화한 경우, Android N 실행 중인 기기에서
앱을 시작해야 하며, 앱을 자유형식 화면
분할 모드로 둬야 합니다. 앱이 전체 화면 모드에 남아있는지
확인하세요.
</p>