IT_Programming/Android_Java

[펌] Android N - 멀티윈도우 지원

JJun ™ 2016. 8. 4. 13:28



 출처: https://developer.android.com/preview/features/multi-window.html



다중 창 지원

Android N은 둘 이상의 앱을 동시에 표시하기 위한 지원을 추가합니다. 핸드헬드 기기에서 두 개의 앱을 화면 분할 모드에서 나란히 또는 상하로 실행할 수 있습니다. TV 기기에서 앱이PIP(Picture-In-Picture) 모드를 사용하는 경우 사용자가 다른 앱과 상호작용하는 동안에 계속 동영상을 재생할 수 있습니다.

N Preview SDK로 앱을 빌드하는 경우, 앱이 다중 창 표시를 처리하는 방식을 구성할 수 있습니다. 예를 들어, 액티비티의 최소 허용 치수를 지정할 수 있습니다. 또한 앱에 대해 다중 창 표시를 비활성화할 수도 있으며, 이 경우 시스템은 앱을 전체 화면 모드에서만 표시합니다.

개요


Android N에서는 여러 앱이 동시에 화면을 공유할 수 있습니다. 예를 들어, 사용자가 화면을 분할하여 왼쪽에서는 웹페이지를 보면서 오른쪽에서는 이메일을 작성할 수 있습니다. 사용자 환경은 기기에 따라 달라집니다.

  • Android N에서 실행되는 핸드헬드 기기는 화면 분할 모드를 제공합니다.
    이 모드에서 시스템은 화면을 두 개의 앱으로 채우고, 이 앱을 나란히 또는 상하로 표시합니다.
    사용자가 두 앱을 구분하는 분할선을 드래그하여 한 앱을 다른 앱보다 더 크게 만들 수 있습니다.
  • Android N을 실행하는 Nexus Player에서, 앱이 PIP 모드로 배치될 수 있으므로, 사용자가 검색을 수행하거나
    다른 앱과 상호작용하는 중에도 앱이 계속해서 콘텐츠를 표시할 수 있습니다.
  • 더 큰 기기를 제조하는 업체는 자유형식 모드를 선택할 수 있으며, 이 경우 사용자가 각 액티비티의 크기를 자유롭게 조정할 수 있습니다.
    제조업체가 이 기능을 활성화하면, 기기는 화면 분할 모드 뿐만 아니라 자유형식 모드를 제공합니다.


그림 1. 화면 분할 모드에서 나란히 실행 중인 두 앱.



사용자가 다음과 같이 다중 창 모드로 전환할 수 있습니다.

  • 사용자가 Overview 화면을 열고 액티비티 제목을 길게 누르면, 이 액티비티를 화면의 강조 표시된 부분으로 드래그하여
    다중 창 모드에 둘 수 있습니다.
  • 사용자가 Overview 버튼을 길게 누르면, 기기가 현재 액티비티를 다중 창 모드에 두고 Overview 화면을 열며,
    이 화면에서 사용자는 화면을 공유하기 위한 또 다른 액티비티를 선택할 수 있습니다.


사용자는 여러 액티비티가 화면을 공유하는 동안 한 액티비티에서 또 다른 액티비티로 데이터를 드래그 앤 드롭할 수 있습니다.
(이전에는, 사용자가 단일 액티비티 내에서만 데이터를 드래그 앤 드롭할 수 있었습니다.)



다중 창 수명 주기



다중 창 모드는 액티비티 수명 주기를 변경하지 않습니다.

다중 창 모드에서는, 사용자가 가장 최근에 상호작용했던 액티비티만 지정된 시간에 활성화됩니다. 이 액티비티는 최상위로 간주됩니다.
다른 모든 액티비티는 표시되어 있더라도 일시 정지된 상태입니다. 그러나 시스템은 이러한 일시 정지되었지만 표시된 액티비티에게 표시되지
않은 액티비티보다 더 높은 우선 순위를 부여합니다. 사용자가 일시 정지된 액티비티 중 하나와 상호작용하면, 해당 액티비티가 재개되고
이전의 최상위 액티비티가 일시 정지됩니다.

참고
:
 다중 창 모드에서는 앱이 일시 정지된 상태에서도 여전히 사용자에게 표시될 수 있습니다.
 앱이 일시 정지된 동안에도 액티비티를 계속해야 하는 경우도 있습니다. 예를 들어, 일시 정지 모드이지만 표시된 동영상 재생 앱은
 계속해서 동영상을 보여줘야 합니다. 이러한 이유로, 동영상을 재생하는 액티비티는 onPause() 핸들러에서 동영상을 일시 정지하지 
않는 것이 좋습니다. 그 대신, onStop()에서 동영상을 일시 정지하고, onStart()에서 재생을 재개해야 합니다.


사용자가 앱을 다중 창 모드에 놓으면 시스템은, 런타임 변경 처리에 지정된 대로, 구성 변경을 액티비티에 알려줍니다.
이 동작은 사용자가 앱의 크기를 조정하거나 앱을 전체 화면 모드로 다시 전환할 때도 발생합니다.
기본적으로, 이 변경에서 액티비티-수명 주기 관계는 기기 모드가 세로 모드에서 가로 모드로 전환되었음을 시스템이 앱에 알려줄 때와
동일합니다(단순 스왑 대신 기기 치수가 변경되는 경우는 제외). 런타임 변경 처리에서 설명한 대로, 액티비티 스스로 구성 변경을 처리하거나, 시스템이 액티비티를 소멸시키고 새 치수로 다시 액티비티를 생성하도록 할 수 있습니다.

사용자가 창의 크기를 조정하여 한쪽 치수를 더 크게 만드는 경우, 시스템은 사용자 작업에 맞게 액티비티의 크기를 조정하고 필요한 경우 
런타임 변경을 수행합니다. 앱이 새로 노출되는 영역에 그릴 때 지연이 발생하는 경우, 시스템은 windowBackground 속성 또는
기본 windowBackgroundFallback 스타일 속성에 의해 지정된 색으로 이 영역을 임시로 채웁니다.



앱을 다중 창 모드로 구성



앱이 Android N을 대상으로 하는 경우, 앱의 액티비티가 다중 창 표시를 지원하는지 여부와 지원 방법을 구성할 수 있습니다.
매니페스트에서 속성을 설정하여 크기와 레이아웃을 제어할 수 있습니다. 루트 액티비티의 속성 설정은 작업 스택 내의 모든 액티비티에
적용됩니다. 예를 들어, 루트 액티비티의android:resizeableActivity가 true로 설정된 경우, 작업 스택에 있는 모든 액티비티의 크기를
조정할 수 있습니다.

참고
:
 Android N보다 더 낮은 버전의 SDK로 다중 방향 앱을 빌드하는 경우 사용자가 앱을 다중 창 모드에서 사용하면, 시스템이 이 앱의 크기를
 강제로 조정합니다. 앱이 예상치 못하게 동작할 수 있음을 사용자에게 경고하는 대화 상자가 표시됩니다. 시스템은 고정 방향 앱의 크기는
 조정하지 않습니다. 사용자가 다중 창 모드 하에서 고정 방향 앱을 열려고 시도하면, 앱이 전체 화면을 차지합니다.


android:resizeableActivity

매니페스트의 <activity> 또는 <application> 노드에서 이 속성을 설정하여 다중 창 표시를 활성화하거나 비활성화합니다.

android:resizeableActivity=["true" | "false"]

이 속성을 true로 설정하면, 액티비티를 분할 화면 모드와 자유형식 모드로 시작할 수 있습니다.
이 속성을 false로 설정하면, 액티비티가 다중 창 모드를 지원하지 않습니다.
이 값이 false이고 사용자가 다중 창 모드에서 액티비티를 시작하려고 시도하면, 액티비티가 전체 화면을 차지합니다.

앱이 Android N을 대상으로 하지만 이 속성에 값을 지정하지 않은 경우, 이 속성의 기본값은 true가 됩니다.



android:supportsPictureInPicture

이 속성을 매니페스트의 <activity> 노드에 설정하여 액티비티가 PIP 표시를 지원하는지 여부를 나타냅니다. 
android:resizeableActivity가 false인 경우 이 속성이 무시됩니다.

android:supportsPictureInPicture=["true" | "false"]



레이아웃 속성

Android N에서 <layout> 매니페스트 요소는 다중 창 모드에서 액티비티가 동작하는 방식에 영향을 미치는 여러 속성을 지원합니다.

android:defaultWidth
자유형식 모드에서 시작될 때 액티비티의 기본 너비.
android:defaultHeight
자유형식 모드에서 시작될 때 액티비티의 기본 높이.
android:gravity
자유형식 모드에서 시작될 때 액티비티의 초기 배치. 적당한 값은 Gravity 참조를 확인하세요.
android:minimalHeightandroid:minimalWidth
화면 분할 및 자유형식 모드에서 액티비티의 최소 높이 및 최소 너비. 사용자가 화면 분할 모드에서 디바이더를 이동하여 액티비티를
지정된 최소값보다 더 작게 만드는 경우, 시스템은 이 액티비티를 사용자가 요청한 크기로 자릅니다.


예를 들어, 다음 코드는 액티비티가 자유형식 모드로 표시될 때 이 액티비티의 기본 크기와 위치 및 최소 크기를 지정하는 방법을 보여줍니다.

<activity android:name=".MyActivity">
   
<layout android:defaultHeight="500dp"
         
android:defaultWidth="600dp"
         
android:gravity="top|end"
         
android:minimalHeight="450dp"
         
android:minimalWidth="300dp" />
</activity>


앱을 다중 창 모드에서 실행


Android N에서는 다중 창 모드에서 실행 가능한 앱을 지원하는 새로운 기능을 제공합니다.


다중 창 모드에서 비활성화되는 기능

기기가 다중 창 모드에 있는 경우 일부 기능이 비활성화되거나 무시되는데, 그 이유는 이들 기능은 기기 화면을 다른 액티비티 또는 앱과
공유하는 액티비티에는 적합하지 않기 때문입니다. 이러한 기능에는 다음이 포함됩니다.

  • 일부 시스템 UI 사용자 지정 옵션이 비활성화됩니다.
    예를 들어, 앱이 전체 화면 모드에서 실행되지 않을 경우에는 상태 표시줄을 숨길 수 없습니다.
  • 시스템이 android:screenOrientation 속성의 변경을 무시합니다.



다중 창 변경 알림 및 쿼리


다중 창 표시를 지원하기 위해 다음과 같은 새 메서드가 Activity 클래스에 추가되었습니다.
각 메서드에 대한 자세한 내용은 N Preview SDK 참조를 확인하세요.

Activity.isInMultiWindowMode()
액티비티가 다중 창 모드에 있는지를 알아내려면 이 메서드를 호출하세요.
Activity.isInPictureInPictureMode()
액티비티가 PIP 모드에 있는지를 알아내려면 이 메서드를 호출하세요.

참고
:
 PIP 모드는 다중 창 모드의 특별한 케이스입니다. myActivity.isInPictureInPictureMode()가 true를 반환하면
 myActivity.isInMultiWindowMode()도 역시 true를 반환합니다.


Activity.onMultiWindowModeChanged()
시스템은 액티비티가 다중 창 모드로 들어가거나 이 모드에서 나올 때마다 이 메서드를 호출합니다.
시스템은 액티비티가 다중 창 모드로 들어갈 때는 true 값을 메서드에 전달하고, 액티비티가 다중 창 모드에서 나올 때는 false 값을
전달합니다.
Activity.onPictureInPictureModeChanged()
시스템은 액티비티가 PIP 모드로 들어가거나 이 모드에서 나올 때마다 이 메서드를 호출합니다.
시스템은 액티비티가 PIP 모드로 들어갈 때는 true 값을 메서드에 전달하고, 액티비티가 PIP에서 나올 때는 false 값을 전달합니다.


또한 이들 각 메서드의 Fragment 버전이 있습니다(예: Fragment.isInMultiWindowMode()).



PIP 모드로 들어가기

액티비티를 PIP 모드에 두려면, 새로운 메서드인 Activity.enterPictureInPictureMode()를 호출합니다.
기기가 PIP 모드를 지원하지 않으면 이 메서드는 영향이 없습니다. 자세한 내용은 PIP 문서를 참조하세요.


다중 창 모드에서 새 액티비티 시작

새 액티비티를 시작하는 경우, 가능하면 이 새 액티비티가 현재 액티비티에 인접하여 표시되어야 함을 시스템에게 알려줄 수 있습니다.
이를 위해 , 플래그Intent.FLAG_ACTIVITY_LAUNCH_TO_ADJACENT를 사용합니다. 이 플래그를 전달하면 다음과 같은 동작이 요청됩니다.

  • 기기가 화면 분할 모드에 있는 경우, 시스템은 시작한 액티비티 옆에 새 액티비티를 만들려고 시도하므로, 두 액티비티가 화면을 공유합니다.
    시스템이 이 작업을 수행할 수 있다고 보장되지는 않지만, 가능하면 액티비티를 인접하게 만듭니다.
  • 기기가 화면 분할 모드에 있으면, 이 플래그가 영향을 미치지 않습니다.

기기가 자유형식 모드에 있고 새 액티비티를 시작 중인 경우, ActivityOptions.setLaunchBounds()를 호출하여 이 새 액티비티의 치수와
화면 위치를 지정할 수 있습니다. 기기가 다중 창 모드에 있지 않으면, 이 메서드가 영향을 미치지 않습니다.

참고
:
 작업 스택 내에서 액티비티를 시작하는 경우, 이 액티비티는 화면상의 액티비티를 대체하여, 모든 다중 창 속성을 상속합니다.
  새 액티비티를 다중 창 모드에서 별도 창으로 시작하려면, 새 작업 스택에서 액티비티를 시작해야 합니다.


드래그 앤 드롭 지원

사용자는 두 액티비티가 화면을 공유하는 동안 한 액티비티에서 다른 액티비티로 데이터를 드래그 앤 드롭할 수 있습니다.
(이전에는, 사용자가 단일 액티비티 내에서만 데이터를 드래그 앤 드롭할 수 있었습니다.)
이러한 이유로, 앱이 현재 지원하지 않는 경우에는 드래그 앤 드롭 기능을 앱에 추가하는 것이 좋습니다.

N Preview SDK는 앱 간의 드래그 앤 드롭을 지원하기 위해 android.view 패키지를 확장합니다.
다음과 같은 클래스와 메서드에 대한 자세한 내용은, N Preview SDK 참조를 참조하세요.

android.view.DropPermissions
놓기를 수신하는 앱에 부여되는 권한을 지정하기 위한 토큰 객체.
View.startDragAndDrop()
View.startDrag()의 새 별칭. 액티비티 간의 드래그 앤 드롭을 활성화하려면, 새 플래그 View.DRAG_FLAG_GLOBAL을 전달합니다.
수신자 액티비티에게 URI 권한을 부여해야 하는 경우, 새 플래그 View.DRAG_FLAG_GLOBAL_URI_READ 또는 
View.DRAG_FLAG_GLOBAL_URI_WRITE를 적절하게 전달합니다.
View.cancelDragAndDrop()
현재 진행 중인 드래그 작업을 취소합니다. 드래그 작업을 발생시킨 앱에 의해서만 호출될 수 있습니다.
View.updateDragShadow()
현재 진행 중인 드래그 작업의 드래그 그림자를 대체합니다. 드래그 작업을 발생시킨 앱에 의해서만 호출될 수 있습니다.
Activity.requestDropPermissions()
DragEvent에 포함된 ClipData로 전달되는 콘텐츠 URI의 권한을 요청합니다.



앱의 다중 창 지원 테스트


앱을 Android N용으로 업데이트하든 안하든 간에, Android N이 실행 중인 기기에서 사용자가 앱을 다중 창 모드로 시작하려고 시도하는 경우,
앱이 다중 창 모드에서 어떻게 작동하는지 확인해야 합니다.


테스트 기기 구성

기기에 Android N을 설치하면, 화면 분할 모드가 자동으로 지원됩니다.


앱이 N Preview SDK로 작성되지 않은 경우

앱을 N Preview SDK로 빌드하지 않았는데 사용자가 앱을 다중 창 모드에서 사용하려고 시도하는 경우,
이 앱이 고정 방향을 선언하지 않으면 시스템이 앱의 크기를 강제로 조정합니다.

앱이 고정 방향을 선언하지 않은 경우, Android N이 실행 중인 기기에서 앱을 시작해야 하며, 앱을 화면 분할 모드에 두도록 시도해야 합니다.
앱의 크기를 강제로 조정하는 경우 사용자 환경이 적절한지 확인하세요.

앱이 고정 방향을 선언하는 경우, 앱을 다중 창 모드에 두도록 시도해야 합니다. 이 때 앱이 전체 화면 모드에 남아있는지 확인하세요.


다중 창 모드를 지원하는 경우

N Preview SDK로 앱을 작성했는데 다중 창 지원을 비활성화하지 않은 경우, 화면 분할 및 자유형식 모드에서 다음과 같은 동작을 확인하세요.

  • 앱을 전체 화면 모드에서 시작한 다음, Overview 버튼을 길게 눌러서 다중 창 모드로 전환합니다.
    앱이 적절히 전환되는지 확인합니다.
  • 앱을 다중 창 모드에서 직접 시작하고, 이 앱이 적절히 시작되는지 확인합니다.
    다중 창 모드에서 앱을 시작하려면, Overview 버튼을 누르고 앱의 제목 표시줄을 길게 누른 다음 화면의 강조 표시된 영역 중 하나로
    제목 표시줄을 끌어서 놓습니다.
  • 분할선을 끌어서 화면 분할 모드에서 앱의 크기를 조정합니다.
    작동 중단 없이 앱 크기가 조정되는지 확인하고, 필요한 UI 요소가 표시되는지 확인합니다.
  • 앱에 최소 치수를 지정한 경우, 이 치수 아래로 앱 크기를 조정해 봅니다.
    지정된 최소값보다 더 작게 앱 크기를 조정할 수 없는지 확인합니다.
  • 모든 테스트를 통해 앱의 성능이 적절한지 확인합니다.
    예를 들어, 앱 크기를 조정한 후 UI를 업데이트하기에 지연이 너무 길지 않은지 확인합니다.



테스트 검사 목록

다중 창 모드에서 앱의 성능을 확인하려면, 다음 작업을 시도해 보세요.
별다른 설명이 없는 한, 화면 분할 및 다중 창 모드 에서 모두 이들 작업을 시도해야 합니다.

  • 다중 창 모드에 들어갔다 나갑니다.
  • 자신의 앱에서 다른 앱으로 전환하고, 앱이 표시는 되지만 활성화되지 않은 동안에 적절히 동작하는지 확인합니다.
    예를 들어, 앱이 동영상을 재생 중인 경우, 사용자가 다른 앱과 상호작용하는 동안에 이 동영상이 계속 재생되는지 확인합니다.
  • 화면 분할 모드에서, 분할선을 이동하여 앱을 더 크거나 작게 만들어 봅니다.
    앱을 나란히 또는 상하로 놓은 구성에서 이러한 작업을 시도해 봅니다.
    앱의 작동이 중단되지 않는지, 필수 기능이 표시되는지, 그리고 크기 조정 작업이 너무 오래 걸리지 않는지 확인합니다.
  • 빠르게 연속해서 여러 가지 크기 조정 작업을 수행합니다. 앱의 작동이 중단되거나 메모리가 누수되지 않는지 확인합니다.
    앱의 메모리 사용량을 확인하는 방법에 대해서는 RAM 사용량 검사를 참조하세요.
  • 여러 가지 다른 창 구성에서 앱을 정상적으로 사용하고, 이 앱이 제대로 작동하는지 확인합니다.
    텍스트를 읽을 수 있는지 확인하고, 해당 UI 요소가 상호작용하기에 너무 작지 않은지 확인합니다.



다중 창 지원을 비활성화한 경우

android:resizableActivity="false"를 설정하여 다중 창 지원을 비활성화한 경우, Android N을 실행 중인 기기에서 앱을 시작해야 하며,
앱을 자유형식 및 화면 분할 모드로 둬야 합니다. 이 때 앱이 전체 화면 모드에 남아있는지 확인하세요.