Android N에서 곧 출시될 다중 창 지원이 개발자에게 어떤 의미인지, 그리고 이를 최대한 활용하는 방법에 대한 개요를 제공합니다!
다중 창 지원은 우리가 Android N에서 기다리고 있는 멋진 기능입니다. 우리는 오랫동안 모든 기기에서 사용할 수 있기를 원했습니다.. 하지만 즐거운 경험이 되려면 개발자가 이를 올바르게 지원하기 위해 앱을 일부 변경해야 할 수도 있습니다.
Google I/O 세션 중 하나는 개발자가 다중 창 지원으로 인해 발생하는 새로운 API와 시스템 동작 변경 사항에 대해 알아보는 것이었습니다.
세션은 Android ActivityManager의 기술 수석 관리자인 Wale Ogunwale이 발표했으며 WindowManager 프레임워크 구성 요소 - 그와 그의 팀은 Android의 다중 창을 담당하고 있습니다.
당신은 볼 수 있습니다 YouTube의 다중 창 모드 세션이지만 여기서는 세션 개요도 제공합니다.
N에는 세 가지 다중 창 모드가 도입되었습니다.
주목할 가치가 있습니다. 우리는 이전에 N의 다중 창에 대해 다루었고 현재 시스템에 대한 몇 가지 비판을 제공했습니다.. 이를 염두에 두고 자유형 모드가 모든 장치에서 유용한 응용 프로그램을 제공할 수 있는 PIP(Picture-in-Picture) 모드에 조금 더 가까워지기를 바랍니다.
- 분할 화면 모드: 기본적으로 사용 가능한 모드입니다. 이름에서 알 수 있듯이 두 개의 응용 프로그램을 나란히 열 수 있습니다.
- 자유형 모드: 제조업체는 대형 장치에서 이 기능을 활성화할 수 있으며 이를 통해 사용자는 분할 화면 모드 외에도 활동 크기를 자유롭게 조정할 수 있습니다.
- PIP 모드: Android TV 기기를 대상으로 하는 이 모드는 사용자가 다른 애플리케이션과 상호작용하는 동안 비디오 플레이어가 고정된 창에서 실행되도록 고안되었습니다.
앱에서 다중 창 지원을 활성화하는 것은 간단합니다. 이미 N을 대상으로 하고 있다면 아무 것도 할 필요가 없습니다. 다중 창을 비활성화하도록 선택해야 하는 경우 다음을 설정하여 수행할 수 있습니다.
android: resizeableActivity
매니페스트의 활동 속성. false
. 이는 앱이 항상 나쁜 방식으로 눈에 띄게 만들기 때문에 실제로 정당한 경우에만 수행되어야 합니다. 사용자(또는 다른 앱)가 다중 창에서 실행하려고 해도 전체 화면 모드로 실행됩니다. 방법. 루트 활동의 속성은 해당 작업 스택 내의 모든 활동에 적용된다는 점에 유의하는 것이 중요합니다. 즉, 다른 앱에서 시작할 수 있는 활동이 있는 경우 다중 창 모드를 지원하는지 확인하세요. 다른 앱이 다음을 사용하여 새 작업에서 활동을 시작한다고 보장할 수 없기 때문입니다. Intent#FLAG_ACTIVITY_NEW_TASK
.Picture-in-picture 모드 지원은 다음을 통해 명시적으로 선언되어야 합니다. android: supportsPictureInPicture
기인하다. 다음과 같은 경우 이 속성은 무시됩니다. android: resizeableActivity
이다. false
.Layout 속성은 자유 형식 창의 기본 크기 및 배치를 설정하거나 자유 형식 및 분할 화면 모드 모두에 대해 최소 너비 또는 높이를 지정하는 데 사용할 수 있습니다. -
android: defaultWidth
/android: defaultHeight
: 활동의 기본 크기(자유 형식 모드)입니다. -
android: gravity
: 활동의 초기 위치입니다(자유형 모드). -
android: minimalWidth
/android: minimalHeight
: 활동의 최소 크기(자유 형식 및 분할 화면 모드)
다중 창 지원이 도입되면서 앱이 올바르게 작동하는지 확인하기 위해 앱에서 몇 가지 사항을 다시 확인해야 할 수도 있습니다.
활동 수명주기 이해
그만큼. 활동 수명주기 다중 창 모드에서는 변경되지 않습니다. 즉, 활동 상태 간의 일부 미묘한 차이로 인해 N 이전에는 일반적으로 알 수 없는 의도하지 않은 동작이 발생할 수 있습니다. 그것을 아는 것이 중요합니다.Activity#onResume()
그리고. Activity#onPause()
앱이 포커스를 얻거나 잃을 때 호출되지만, 표시가 시작되거나 중지될 때는 반드시 호출되는 것은 아닙니다. (한 번에 하나의 앱에만 포커스가 있을 수 있다는 점을 기억하세요.) 콘텐츠를 지속적으로 업데이트하는 앱(예: 비디오 재생)의 경우 콘텐츠 업데이트 시작 및 중지를 처리해야 합니다. Activity#onStart()
그리고. Activity#onStop()
대신에. 예를 들어 비디오 앱에는 그렇게 하지 않습니다. 이는 앱에 초점이 맞춰진 경우에만 재생이 발생함을 의미합니다., 이는 다중 창 모드의 목적을 무효화합니다. Android N Developer Preview가 처음 출시되었을 때 공식 YouTube 앱에도 비슷한 문제가 있었습니다.. 런타임 변경 처리
앱이 다중 창 모드로 전환되면 일부 장치 구성이 변경됩니다. 활동이 다시 시작되도록 허용할 수 있습니다(이 경우. 조각 유지 시작 시 활동이 집중적인 작업을 수행해야 하는 경우에는 좋은 생각일 수도 있고 그렇게 선택하는 것도 좋습니다. 구성 변경 사항을 명시적으로 처리 대신에. 다중 창 모드에 들어가거나 내부에 있을 때 네 가지 장치 구성이 변경될 수 있습니다.screenSize
, smallestScreenSize
, screenLayout
그리고. orientation
. 을 참조하세요. Android 개발자 문서 각 속성에 대한 자세한 내용은 참고하세요. orientation
이 경우 더 이상 장치의 방향을 참조하지 않습니다. 대신, 이는 단지 활동의 너비가 높이(가로)보다 큰지 또는 더 큰지를 나타냅니다. (세로)가 아닙니다. 활동이 이러한 변경 사항을 처리할 것이라고 선언하는 것은 매니페스트에서 수행할 수 있습니다. android: name=".MyActivity"android: configChanges="screenSize|smallestScreenSize|screenLayout|orientation"/>
이는 실제로 이러한 변경 사항을 처리해야 함을 의미합니다. Activity#onConfigurationChanged()
, 뷰를 수동으로 업데이트하거나 일부 리소스를 다시 로드합니다. 다중 창 모드에서 비활성화된 기능
일부 시스템 기능은 다중 창 모드에 있는 동안 활동의 영향을 받지 않습니다.- 시스템 표시줄 흐리게/숨기기 또는 몰입형 모드 사용과 같은 상태 표시줄 및 탐색 표시줄 변경은 효과가 없습니다. 활동이 화면의 일부만 차지하므로 이는 의미가 있습니다.
- 그만큼
android: screenOrientation
액티비티 속성은 다중 창 모드에서도 효과가 없습니다. 액티비티의 크기를 조정할 수 있으므로 더 이상 고정된 방향을 갖는 것이 의미가 없습니다.
다중 창 이벤트에 대한 새로운 콜백과 현재 상태를 쿼리하는 메서드가 추가되었습니다.
-
Activity#onMultiWindowModeChanged(boolean inMultiWindow)
: 활동 상태가 전체 화면에서 다중 창으로 또는 그 반대로 변경될 때 호출됩니다. -
Activity#onPictureInPictureModeChanged(boolean inPictureOnPicture)
: 활동 상태가 PIP 모드로/에서 변경될 때 호출됩니다. -
Activity#isInMultiWindowMode()
/Activity#isInPictureInPictureMode()
: 활동이 다중 창/화면 속 화면 모드인지 여부를 반환합니다. -
Activity#overlayWithDecorCaption(boolean overlay)
: 자유 형식 창의 경우 이 방법을 사용하면 캡션(창을 드래그하는 데 사용되는 막대)이 콘텐츠를 아래로 누르는 대신 콘텐츠에 오버레이되도록 할 수 있습니다.
Activity#overlayWithDecorCaption()
, 이러한 방법은 에서도 제공됩니다. Fragment
수업. 다중 창 모드에서 활동 시작
-
Activity#enterPictureInPictureMode()
활동을 PIP 모드로 전환하는 데 사용할 수 있습니다. PiP 모드의 활동은 입력 이벤트에 대한 알림을 받지 않습니다.MediaSession#setMediaButtonReceiver()
그러한 이벤트를 처리하고 싶다면. 또한 관심이 있으시면 Android 개발자 웹사이트를 확인해 보세요. Android N의 PIP(Picture-in-Picture).
- 장치가 분할 화면 모드인 경우 다음을 사용하여 옆에 다른 활동을 시작하도록 시스템에 지시할 수 있습니다.
Intent#FLAG_ACTIVITY_LAUNCH_ADJACENT
깃발. 분할 화면 모드가 아닌 경우 플래그는 효과가 없습니다. - 장치가 자유형 모드인 경우
ActivityOptions#setLaunchBounds()
화면에서 새 활동의 크기와 위치를 지정하는 데 사용할 수 있습니다.
끌어서 놓기
드래그 앤 드롭 지원은 Honeycomb 이후부터 있었지만 이전에는 동일한 활동 내에서만 가능했습니다. 지금이다. 멀티 윈도우에서 지원됨 또한. 이를 구현하는 것 같습니다. 대부분 이전과 동일, 교차 활동 드래그 앤 드롭을 위한 몇 가지 추가 사항:View#startDragAndDrop()
- 다음에 대한 새 별칭
View#startDrag()
. - 교차 활동 드래그 앤 드롭을 활성화하려면 새 플래그를 전달하세요.
View#DRAG_FLAG_GLOBAL
. - 수신자 활동에 URI 권한을 부여해야 하는 경우 새 플래그를 전달하세요.
View#DRAG_FLAG_GLOBAL_URI_READ
또는View#DRAG_FLAG_GLOBAL_URI_WRITE
, 적절한.
- 다음에 대한 새 별칭
View#updateDragShadow()
- 현재 진행 중인 드래그 작업의 드래그 섀도우를 대체합니다. 드래그 작업을 시작한 앱에서만 호출할 수 있습니다.
View#cancelDragAndDrop()
- 현재 진행 중인 드래그 작업을 취소합니다. 드래그 작업을 시작한 앱에서만 호출할 수 있습니다.
- 장치가 자유형 또는 PIP(Picture-in-Picture) 모드를 지원하는지 확인하는 것은 다음을 통해 가능합니다.
PackageManager#hasSystemFeature()
, 사용PackageManager#FEATURE_FREEFORM_WINDOW_MANAGEMENT
그리고PackageManager#FEATURE_FREEFORM_PICTURE_IN_PICTURE
각기.
- 그만큼
android: windowBackground
활동의 크기가 조정되고 렌더링이 지연되는 경우 속성을 배경 드로어로 사용할 수 있습니다. 만약에android: windowBackground
설정되지 않았습니다.android: windowBackgroundFallback
대신 사용됩니다. 예제는 다중 창 놀이터 샘플 앱을 참조하세요..
Wale는 사용자에게 최상의 경험을 제공하기 위해 몇 가지 모범 사례를 제시했습니다.
- 핸들 모드가 우아하게 변경됩니다.
- 방향에 관계없이 UI 일관성 유지. 원활한 전환을 위해 요소의 위치를 변경하지 마세요.
- 위 내용을 확장하면, 휴대폰/태블릿 레이아웃에 대해 매우 다른 레이아웃 간에 전환하지 마십시오.. 대신 일관성을 위해 더 작은 크기에 맞게 태블릿 레이아웃을 조정하세요.
- 귀하의 활동이 소규모 규모에 맞게 조정되었는지 확인하십시오. ~에 의해 머티리얼 디자인 패턴을 따르기.
- 사용
FLAG_ACTIVITY_LAUNCH_ADJACENT
분할 화면 모드에서 더 즐거운 경험을 만드는 것이 합리적일 때. - 정당한 경우에만 크기 조정 비호환성을 선언하세요.. 위에서 논의한 것처럼 그렇지 않으면 앱이 나쁜 방식으로 돋보이게 됩니다.
Wale는 몇 가지 유용한 리소스를 추가로 제공하며 세션을 종료했습니다.
- 다중 창 문서.
- 분할 화면 모드에 대한 머티리얼 디자인 가이드라인.
- 샘플 다중 창 앱.