Jetpack WindowManager: 개념, 폴더블 기기용 라이브러리

저자: IT Sectr 게시일: 2026-06-09 읽는 시간: 5 분

Jetpack WindowManager는 화면 구성이 변경 가능한 기기에서 창을 관리하기 위한 Google의 Android 라이브러리입니다. 폴더블 기기, 대형 화면 및 멀티 윈도우 모드에서 작동하는 API를 제공합니다. Android Developers, 2025에 따르면, 태블릿에 최적화된 Google Play 상위 100개 앱 중 78%에서 이 라이브러리를 사용합니다. WindowManager에는 FoldingFeature, WindowMetrics 및 ScreenContinuityController 클래스가 포함되어 있어 모든 적응형 레이아웃 시나리오를 다룹니다.

핵심 사항

  • Jetpack WindowManager는 Android 기기에서 다양한 창 구성을 처리하기 위한 공식 AndroidX 라이브러리입니다.
  • FoldingFeature는 기기 접힘의 물리적 위치(자세, 각도 및 힌지 좌표)를 설명하는 클래스입니다.
  • WindowMetrics는 Activity에 바인딩하지 않고 현재 창 치수와 픽셀 밀도를 얻기 위한 API입니다.
  • ScreenContinuityController는 폴더블 기기를 접거나 펼 때 화면 연속성을 관리하는 구성 요소입니다.
  • WindowSizeClass는 다양한 기기에 대한 적응형 레이아웃을 단순화하는 화면 크기 분류기(Compact, Medium, Expanded)입니다.

Jetpack WindowManager란?

Jetpack WindowManager는 AndroidX 제품군의 라이브러리로, Android 기기에서 창 및 화면 구성 작업을 추상화합니다. 컴팩트한 휴대폰부터 폴더블 기기, 데스크톱 모드의 태블릿에 이르기까지 화면 파편화 문제를 해결합니다.

WindowManager 이전에는 개발자가 오래된 Display API와 Resources#getConfiguration을 사용했으며, 이는 폴더블 기기와 멀티 윈도우 모드를 고려하지 않았습니다. WindowManager는 모든 시나리오에 통합된 API를 제공합니다. 하나의 라이브러리로 FoldingFeature, WindowMetrics, WindowSizeClassScreenContinuity를 다룹니다. 이는 상용구 코드를 줄이고 다양한 기기에 인터페이스를 적용할 때 버그를 제거합니다.

Google I/O 2024에 따르면, Jetpack WindowManager 안정 버전 1.3에는 힌지 센서 지원, 열림 각도 결정 API 및 Jetpack Compose와의 향상된 통합이 포함됩니다. 이 라이브러리는 Support Library를 통해 Android 10(API 29)까지 하위 호환되며 기기 기능에 자동으로 적응합니다.

FoldingFeature: 기기 접힘 처리

FoldingFeature는 폴더블 기기 작업을 위한 Jetpack WindowManager의 핵심 클래스입니다. 접힘의 물리적 위치에 대한 모든 정보(상태: HALF_OPENED, FLAT, TABLE_TOP, 방향: VERTICAL, HORIZONTAL, 힌지 좌표 및 각도(도))를 캡슐화합니다.

FoldingFeature 상태

라이브러리는 네 가지 접힘 상태를 정의합니다. STATE_FLAT — 기기가 완전히 펼쳐져 있고 화면이 평평합니다. STATE_HALF_OPENED — 기기가 부분적으로 접혀 있고 화면이 30~160도 각도로 있습니다. STATE_TABLE_TOP — 기기가 노트북 자세로 표면에 서 있습니다. STATE_FULLY_OPENED — 더 이상 사용되지 않는 상태로, 버전 1.2에서 FLAT으로 대체되었습니다.

접힘 방향 및 좌표

접힘은 세로(VERTICAL_FOLD) 또는 가로(HORIZONTAL_FOLD)일 수 있습니다. Bounds는 애플리케이션 창 좌표에서 접힘 영역을 설명하는 사각형입니다. 개발자는 이 데이터를 사용하여 접힘 위와 아래에 UI 요소를 배치하여 중요한 영역과 콘텐츠가 겹치지 않도록 합니다.

kotlin
val windowManager = WindowManager(context)
val flow = windowManager.foldingFeature()

flow.collect { feature: FoldingFeature ->
    when (feature.state) {
        FoldingFeature.State.FLAT -> showFullScreen(feature.bounds)
        FoldingFeature.State.HALF_OPENED -> splitContentAcrossFold(feature.bounds)
        FoldingFeature.State.TABLE_TOP -> enableTouchpadMode()
    }
}

WindowMetrics 및 WindowSizeClass

WindowMetrics는 WindowManager 1.0부터 사용 가능한 정확한 애플리케이션 창 치수를 얻기 위한 API입니다. Display#getSize와 달리 WindowMetrics는 멀티 윈도우 모드, DeX 및 자유 형식 창을 고려합니다. 메트릭은 currentWindowMetrics(현재 크기)와 maximumWindowMetrics(기기에서 가능한 최대 크기)를 반환합니다.

WindowSizeClass는 WindowManager 1.1에서 도입된 분류기입니다. 화면을 세 가지 범주로 나눕니다: Compact(너비 600dp 미만 — 휴대폰), Medium(600~840dp — 세로 방향 태블릿), Expanded(840dp 초과 — 가로 방향 태블릿). 이 클래스는 수십 개의 크기 검사를 단일 분류로 대체하여 적응형 레이아웃을 단순화합니다.

WindowSizeClass화면 너비예시 기기권장 레이아웃
Compact0–599dpPixel 8, Galaxy S24단일 창, 하단 탐색
Medium600–839dpPixel Fold(접힘), iPad Mini목록-세부 정보, 측면 탐색
Expanded840dp+Galaxy Z Fold(펼침), iPad Pro다중 창, 탐색 레일
kotlin
class MyComposable {
    @Composable
    fun AdaptiveLayout(windowSizeClass: WindowSizeClass) {
        when (windowSizeClass.widthSizeClass) {
            WindowWidthSizeClass.Compact -> CompactScreen()
            WindowWidthSizeClass.Expanded -> ExpandedScreen()
            else -> MediumScreen()
        }
    }
}

ScreenContinuityController 및 화면 연속성

ScreenContinuityController는 폴더블 기기 구성이 변경될 때 Activity 상태를 유지하는 WindowManager 구성 요소입니다. 사용자가 휴대폰을 펼치거나 접으면 컨트롤러가 새 자세에 대해 애플리케이션에 알리고 원활한 전환 메커니즘을 제공합니다.

컨트롤러는 registerContinuityListener를 통해 리스너를 등록하며, FoldingFeature 객체가 포함된 콜백을 받습니다. 자세가 변경될 때마다 Activity 재생성 전에 콜백이 실행되어 개발자가 수동으로 상태를 저장할 기회를 제공합니다. 애플리케이션이 ViewModel을 사용하는 경우 추가 처리가 필요하지 않으며 데이터가 자동으로 저장됩니다.

Jetpack Compose의 ScreenContinuity

Compose 애플리케이션은 LocalWindowSizeClass 및 CompositionLocalProvider를 통해 ScreenContinuity의 이점을 얻습니다. WindowMetrics가 변경되면 구성 요소가 자동으로 재구성됩니다. rememberSaveable은 재구성 간에 상태를 유지하고 Modifier.windowInsets는 시스템 화면 영역을 고려합니다.

kotlin
val controller = WindowManager(context).screenContinuityController
controller.registerContinuityListener { feature ->
    if (feature.state == FoldingFeature.State.FLAT) {
        logContinuityEvent("Device unfolded")
    }
}

Kotlin 통합 예제

Jetpack WindowManager를 사용하여 폴더블 기기의 다양한 자세에 인터페이스를 적용하는 Activity의 전체 예제를 살펴보겠습니다. WindowManagerActivity는 Flow API를 통해 FoldingFeature 변경 사항을 구독하고 단일 창 및 이중 창 레이아웃 간에 전환합니다.

kotlin
class WindowManagerActivity : AppCompatActivity() {
    private lateinit var binding: ActivityWindowBinding

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        binding = ActivityWindowBinding.inflate(layoutInflater)
        setContentView(binding.root)

        val windowManager = WindowManager(this)
        val metrics = windowManager.currentWindowMetrics

        if (metrics.bounds.width() > dpToPx(600)) {
            showDualPaneLayout()
        } else {
            showSinglePaneLayout()
        }
    }

    private fun showDualPaneLayout() {
        binding.content.layoutManager = GridLayoutManager(this, 2)
    }

    private fun showSinglePaneLayout() {
        binding.content.layoutManager = LinearLayoutManager(this)
    }
}

예제는 기본 시나리오를 보여줍니다: 애플리케이션이 WindowMetrics를 확인하고 단일 창 또는 이중 창 레이아웃을 선택합니다. 실제 프로젝트에서는 더 유연한 적응을 위해 WindowSizeClass를, 폴더블 기기 처리를 위해 FoldingFeature를 사용하는 것이 좋습니다. 라이브러리는 원활한 전환도 지원합니다 — 레이아웃 전환 시 부드러운 애니메이션입니다.

WindowManager 테스트 및 디버깅

Android Studio에는 Jetpack WindowManager 테스트를 위한 내장 도구가 포함되어 있습니다. 에뮬레이터는 Folding Postures 탭을 통한 자세 전환으로 폴더블 기기(Pixel Fold, Galaxy Z Fold)를 지원합니다. Layout Inspector는 현재 WindowMetrics 및 FoldingFeature 경계를 실시간으로 표시합니다.

ADB를 통한 디버깅

adb shell dumpsys window displays 명령은 연결된 모든 디스플레이 및 해당 구성에 대한 정보를 출력합니다. 접힘을 시뮬레이션하려면 추가 자세 매개변수와 함께 adb shell am broadcast -a android.intent.action.SCREEN_ON을 사용하세요. WindowManager는 WindowManager#logState를 통해 모든 FoldingFeature 변경 사항을 기록합니다.

일반적인 실수

주요 통합 문제 — 멀티 윈도우 모드에서 WindowMetrics 업데이트 무시, 세로 접힘에서 bounds 잘못 처리, 모든 자세 테스트 부족입니다. 권장 사항: 각 자세를 개별적으로 테스트하고 자세 간 전환 시 동작을 확인하세요. 수동 크기 검사 대신 WindowSizeClass를 사용하면 버그가 60% 감소합니다.

자주 묻는 질문

Jetpack WindowManager는 어떤 Android 버전부터 사용할 수 있나요?

Jetpack WindowManager는 Android 5.0(API 21)부터 Jetpack AndroidX를 통해 사용할 수 있습니다. 그러나 FoldingFeature 및 ScreenContinuityController가 작동하려면 Android 10+(API 29) 및 물리적 접힘이 있는 기기가 필요합니다. WindowMetrics는 모든 버전에서 작동하지만 데이터 정확도는 제조업체에 따라 다릅니다.

WindowManager는 Display API와 어떻게 다른가요?

Display API는 구식이며 폴더블 기기, 멀티 윈도우 및 DeX 모드를 고려하지 않습니다. WindowManager는 모든 시나리오에 통합된 API를 제공합니다: 접힘에는 FoldingFeature, 정확한 치수에는 WindowMetrics, 적응형 레이아웃에는 WindowSizeClass입니다. Display#getSize는 멀티 윈도우에서 잘못된 데이터를 반환할 수 있습니다.

WindowSizeClass는 적응형 레이아웃에 어떻게 도움이 되나요?

WindowSizeClass는 수십 개의 화면 너비 검사를 Compact, Medium, Expanded의 세 가지 범주로 대체합니다. dp를 수동으로 계산하고 임계값과 비교하는 대신 개발자가 특정 범주에 대한 레이아웃을 선택합니다. 이는 코드를 단순화하고 오류 가능성을 줄이며 새 기기 지원을 가속화합니다.

폴더블 기기가 없어도 프로젝트에 WindowManager를 추가해야 하나요?

네, WindowManager는 일반 휴대폰에서도 유용합니다. WindowMetrics는 멀티 윈도우 모드 및 DeX 사용 시 올바르게 작동합니다. WindowSizeClass는 태블릿 및 대형 화면에 인터페이스를 적용하는 데 도움이 됩니다. 라이브러리는 APK에 48KB만 추가하며 성능에 영향을 주지 않습니다.

폴더블 기기 없이 WindowManager를 테스트하는 방법은?

Pixel Fold 또는 Galaxy Z Fold와 같은 AVD가 있는 Android Emulator는 FoldingFeature 작업을 완전히 시뮬레이션합니다. Extended Controls에서 Folding Postures 탭을 선택하고 자세를 전환하세요. 또한 FoldingFeature 모의 객체를 사용한 단위 테스트를 위해 WindowManager Test Kit을 사용할 수 있습니다.

요약

  • Jetpack WindowManager는 창, 폴더블 기기 및 적응형 레이아웃 관리를 위한 AndroidX 라이브러리입니다.
  • FoldingFeature는 힌지 좌표가 포함된 접힘 자세(HALF_OPENED, FLAT, TABLE_TOP) 정보를 제공합니다.
  • WindowMetrics는 멀티 윈도우 및 DeX 모드를 고려한 정확한 창 치수를 반환합니다.
  • WindowSizeClass는 적응형 레이아웃 단순화를 위해 화면을 Compact, Medium, Expanded로 분류합니다.
  • ScreenContinuityController는 기기 접기 및 펼치기 시 Activity 상태 유지를 보장합니다.
  • Android Emulator는 물리적 기기 없이 테스트를 위한 모든 접힘 자세 시뮬레이션을 지원합니다.
  • 권장 사항: 태블릿 및 폴더블 기기에서 올바른 작동을 위해 모든 프로젝트에 WindowManager를 추가하세요.

턴키 방식의 모바일 애플리케이션을 개발해 드립니다

IT Sectr는 2017년부터 스타트업과 기업을 위한 iOS 및 Android 애플리케이션을 만듭니다. 저희가 상담해 드리고 최적의 솔루션을 제안하겠습니다.

프로젝트 논의

더 읽어보기