데스크톱 창 지원

데스크톱 창을 사용하면 크기를 조절할 수 있는 앱 창에서 여러 앱을 동시에 실행하여 다목적 데스크톱 환경을 제공할 수 있습니다.

그림 1에서는 데스크톱 윈도잉이 사용 설정된 화면의 구성을 확인할 수 있습니다. 다음 사항을 참고하세요.

  • 사용자는 여러 앱을 동시에 나란히 실행할 수 있습니다.
  • 태스크 바는 실행 중인 앱을 보여주는 디스플레이 하단의 고정된 위치에 있습니다. 사용자는 앱을 고정하여 빠르게 액세스할 수 있습니다.
  • 맞춤설정 가능한 새로운 헤더 표시줄이 최소화 및 최대화와 같은 컨트롤로 각 창 상단을 장식합니다.
그림 1. 태블릿의 데스크톱 창

기본적으로 앱은 Android 태블릿에서 전체 화면으로 열립니다. 데스크톱 창 모드에서 앱을 실행하려면 화면 상단의 창 핸들을 길게 누른 다음 그림 2와 같이 UI 내에서 핸들을 드래그합니다.

앱이 데스크톱 창 모드로 열려 있으면 다른 앱도 데스크톱 창에서 열립니다.

그림 2. 앱 창 핸들을 길게 누른 다음 드래그하여 데스크톱 창 모드로 전환합니다.

사용자는 핸들을 탭하거나 클릭할 때 창 핸들 아래에 표시되는 메뉴에서 데스크톱 창을 호출하거나 단축키 메타 키 (Windows, Command 또는 Search) + Ctrl + 아래쪽을 사용할 수도 있습니다.

사용자는 활성 창을 모두 닫거나 데스크톱 창 상단의 창 핸들을 잡고 앱을 화면 상단으로 드래그하여 데스크톱 창 모드를 종료합니다. Meta + H 단축키도 데스크톱 창을 종료하고 앱을 다시 전체 화면으로 실행합니다.

데스크톱 창으로 돌아가려면 최근 화면에서 데스크톱 공간 타일을 탭하거나 클릭합니다.

크기 조절 가능 여부 및 호환성 모드

데스크톱 윈도잉에서 방향이 잠긴 앱은 자유롭게 크기를 조절할 수 있습니다. 즉, 활동이 세로 방향으로 고정되어 있더라도 사용자는 앱 크기를 가로 방향 창으로 조절할 수 있습니다.

그림 3. 세로 모드 제한 앱의 창 크기를 가로 모드로 조절합니다.

크기 조절 불가로 선언된 앱 (예: resizeableActivity = false)은 가로세로 비율을 동일하게 유지하면서 UI 크기가 조정됩니다.

그림 4. 크기 조절 불가능한 앱의 UI는 창 크기가 조절될 때 크기가 조절됩니다.

방향을 고정하거나 크기 조절 불가로 선언된 카메라 앱은 카메라 뷰파인더에 대해 특별한 처리를 합니다. 창은 크기를 완전히 조절할 수 있지만 뷰파인더는 동일한 가로세로 비율을 유지합니다. 앱이 항상 세로 모드 또는 가로 모드로 실행된다고 가정함으로써 앱은 미리보기 또는 캡처된 이미지 방향이나 가로세로 비율을 잘못 계산하여 이미지가 늘어나거나, 옆으로 기울어지거나, 거꾸로 표시되는 결과를 초래하는 하드코딩을 하거나 다른 가정을 합니다.

앱이 완전히 반응형 카메라 뷰파인더를 구현할 준비가 될 때까지는 특수 처리를 통해 잘못된 가정이 야기할 수 있는 영향을 완화하는 보다 기본적인 사용자 환경을 제공합니다.

카메라 앱의 호환성 모드에 관해 자세히 알아보려면 기기 호환성 모드를 참고하세요.

그림 5. 카메라 뷰파인더는 창 크기가 조절되어도 가로세로 비율이 유지됩니다.

맞춤설정이 가능한 헤더 인셋

데스크톱 창 모드에서 실행되는 모든 앱에는 몰입형 모드에서도 헤더 바가 있습니다.
앱 콘텐츠가 헤더 표시줄로 가려지지 않아야 합니다. 헤더 표시줄은 자막 표시줄 삽입 유형입니다. androidx.compose.foundation.layout.WindowInsets.Companion.captionBar()(뷰의 경우 시스템 표시줄의 일부인 WindowInsets.Type.captionBar()).

인셋 처리에 관한 자세한 내용은 앱에서 더 넓은 화면에 콘텐츠 표시 및 Compose에서 창 인셋 처리를 참고하세요.

헤더 표시줄도 맞춤설정할 수 있습니다. Android 15에서는 앱이 헤더 바 내부에 맞춤 콘텐츠를 그릴 수 있도록 헤더 바를 투명하게 만드는 모양 유형 APPEARANCE_TRANSPARENT_CAPTION_BAR_BACKGROUND를 도입했습니다.

그러면 앱은 시스템에서 앱 상단의 투명한 자막 표시줄에 그리는 시스템 자막 요소 (닫기 및 최대화 버튼)를 제외하고 콘텐츠의 상단 부분을 자막 표시줄 (배경, 맞춤 콘텐츠 등)처럼 보이도록 스타일 지정해야 합니다.

앱은 상태 표시줄과 탐색 메뉴가 전환되는 방식과 마찬가지로 APPEARANCE_LIGHT_CAPTION_BARS를 사용하여 밝은 테마와 어두운 테마의 자막 내 시스템 요소의 모양을 전환할 수 있습니다.

Android 15에서는 앱이 자막 표시줄 인셋을 더 자세히 검사할 수 있는 WindowInsets#getBoundingRects() 메서드도 도입했습니다. 앱은 시스템이 시스템 요소를 그리는 영역과 앱이 시스템 요소를 겹치지 않게 맞춤 콘텐츠를 배치할 수 있는 사용되지 않는 영역을 구분할 수 있습니다.

API에서 반환하는 Rect 객체 목록은 피해야 할 시스템 영역을 나타냅니다. 남은 공간 (캡션 표시줄 인셋에서 직사각형을 뺀 값으로 계산됨)은 앱이 시스템 요소와 겹치지 않고 입력을 받을 수 있는 영역입니다.

맞춤 헤더 구현 전후의 Chrome
그림 6. 맞춤 헤더를 구현하기 전과 후의 Chrome

멀티태스킹 및 멀티 인스턴스 지원

멀티태스킹은 데스크톱 창 관리의 핵심이며 앱의 여러 인스턴스를 허용하면 사용자 생산성이 크게 향상될 수 있습니다.

Android 15에는 PROPERTY_SUPPORTS_MULTI_INSTANCE_SYSTEM_UI가 도입되었습니다. 이 UI를 사용하면 앱이 여러 인스턴스로 실행되도록 앱 시스템 UI를 표시하도록 설정할 수 있습니다.

드래그 동작으로 앱 인스턴스 관리

멀티 윈도우 모드에서 사용자는 뷰 요소를 앱 창 밖으로 드래그하여 새 앱 인스턴스를 시작할 수 있습니다. 사용자는 동일한 앱의 인스턴스 간에 요소를 이동할 수도 있습니다.

그림 7. 데스크톱 창 밖으로 탭을 드래그하여 새 Chrome 인스턴스를 시작합니다.

Android 15에서는 드래그 앤 드롭 동작을 맞춤설정하는 두 가지 플래그가 도입되었습니다.

  • DRAG_FLAG_START_INTENT_SENDER_ON_UNHANDLED_DRAG: 표시된 창에서 드롭을 처리하지 않는 경우 처리되지 않은 드래그를 시스템에 위임하여 시작해야 함을 나타냅니다. 이 플래그를 사용하는 경우 호출자는 실행할 활동에 대한 변경 불가능한 IntentSender가 포함된 ItemClipData에 제공해야 합니다(ClipData.Item.Builder#setIntentSender() 참고). 시스템은 현재 화면 크기나 창 모드와 같은 요소를 기반으로 인텐트를 실행하거나 실행하지 않을 수 있습니다. 시스템에서 인텐트를 실행하지 않으면 일반 드래그 앤 드롭 흐름을 통해 인텐트가 취소됩니다.

  • DRAG_FLAG_GLOBAL_SAME_APPLICATION: 드래그 작업이 창 경계를 넘을 수 있음을 나타냅니다 (동일한 애플리케이션의 여러 인스턴스인 경우).

    이 플래그를 설정한 상태로 startDragAndDrop()를 호출하면 동일한 애플리케이션에 속하는 보이는 창만 드래그 작업에 참여하고 드래그된 콘텐츠를 수신할 수 있습니다.

그림 8. Chrome 앱의 두 인스턴스 간에 탭을 이동합니다.

추가 최적화

앱 실행을 맞춤설정하고 앱을 데스크톱 창 모드에서 전체 화면으로 전환합니다.

기본 크기 및 위치 지정

크기를 조절할 수 있는 앱이라도 사용자 가치를 제공하기 위해 큰 창이 필요한 것은 아닙니다. ActivityOptions#setLaunchBounds() 메서드를 사용하여 활동이 실행될 때의 기본 크기와 위치를 지정할 수 있습니다.

데스크톱 스페이스에서 전체 화면으로 전환

앱은 Activity#requestFullScreenMode()를 호출하여 전체 화면으로 전환할 수 있습니다. 이 메서드는 데스크톱 창 관리에서 앱을 전체 화면으로 직접 표시합니다.