Screen Continuity: 개요, 폴드 API 및 인터페이스 적응

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

Screen Continuity — 폴더블 디바이스의 접힘 및 펼쳐짐 상태 간에 앱의 원활한 전환을 보장하는 Android 메커니즘입니다. 펼칠 때 화면의 물리적 크기가 변경되고 시스템이 새 구성으로 Activity를 다시 시작합니다. Google Developer, 2025에 따르면 연속성을 올바르게 처리하면 사용자 경험이 40% 향상되고 상태 손실에 대한 불만이 줄어듭니다. ScreenContinuity API는 Jetpack WindowManager 버전 1.1부터 포함되어 있으며 개발자가 디바이스 포즈 변경 시 라이프사이클을 관리할 수 있게 합니다.

핵심 사항

  • Screen Continuity — Android 폴더블 디바이스에서 화면 물리적 구성 변경 시 Activity 상태를 보존하는 기술입니다.
  • Jetpack WindowManager는 디바이스 포즈 추적 API(HALF_OPENED, FLAT, TABLE_TOP)를 제공합니다.
  • onRetainNonConfigurationInstance — 접거나 펼친 후 Activity 재생성 시 데이터를 보존하는 핵심 메서드입니다.
  • 테스트 연속성은 Android Studio의 폴더블 디바이스 에뮬레이터 또는 Galaxy Z Fold와 같은 실제 디바이스에서 수행됩니다.
  • 무시 연속성을 무시하면 화면 상태 손실, 양식 데이터 재설정 및 사용자 경험 저하가 발생합니다.

Screen Continuity란?

Screen Continuity는 폴더블 디바이스에서 화면의 물리적 구성이 변경될 때 Activity 상태를 보존하는 Android 메커니즘입니다. 사용자가 전화기를 펼치거나 접으면 시스템이 새 창 크기로 Activity를 다시 시작할 수 있습니다. 연속성은 입력된 데이터, 스크롤 위치 및 현재 화면의 손실을 방지합니다.

Android가 단순히 새 방향으로 Activity를 다시 생성하는 일반적인 화면 회전과 달리, 폴더블 디바이스는 근본적으로 새로운 시나리오를 도입합니다. HALF_OPENED 포즈는 앱이 반쪽 화면에서 작동할 수 있게 하고, FLAT는 완전히 펼쳐진 태블릿 모드에서 작동합니다. Screen Continuity 지원이 없으면 각 포즈 변경 시 인터페이스가 초기 상태로 재설정됩니다.

Google I/O 2024에 따르면, 62% 이상의 폴더블 디바이스 사용자가 상태 전환을 잘못 처리하는 앱을 경험했습니다. Screen Continuity는 API 수준에서 이 문제를 해결하여 개발자에게 UI 저장 및 복원을 위한 준비된 도구를 제공합니다.

폴더블 디바이스 상태: 화면 포즈

Jetpack WindowManagerFoldingFeature 클래스를 통해 폴더블 디바이스의 세 가지 기본 포즈를 정의합니다. 각 포즈는 힌지의 특정 물리적 위치에 해당하며 특별한 인터페이스 처리가 필요합니다.

HALF_OPENED — 반쯤 접힌 상태

디바이스가 30~160도 각도에 있습니다. 화면은 두 개의 논리적 영역으로 나뉩니다. 앱은 위쪽 절반에 콘텐츠를, 아래쪽 절반에 컨트롤을 표시할 수 있습니다. 화상 통화 및 미디어 플레이어용 테이블톱 모드가 이 포즈를 사용합니다.

FLAT — 완전히 펼쳐진 상태

디바이스가 180도 열려 하나의 큰 화면을 형성합니다. 앱이 확장된 작업 공간을 가진 태블릿 모드로 전환됩니다. 이 포즈에서는 탐색 패널과 상세 콘텐츠를 나란히 표시하는 멀티페인 레이아웃을 권장합니다.

TABLE_TOP — 노트북 포즈

디바이스가 약 120도 각도로 표면에 서 있습니다. 화면의 아래쪽 절반이 터치 패널 또는 키보드 역할을 합니다. 이 포즈의 터치패드 모드를 사용하면 화면 아래쪽에서 트랙패드를 에뮬레이트할 수 있습니다.

Android에서 화면 연속성은 어떻게 작동하나요?

Android는 configuration changes 메커니즘을 통해 폴더블 디바이스 구성 변경을 처리합니다. 사용자가 전화기를 펼치면 시스템이 창 크기 변경을 감지하고 표준 Activity 재생성 사이클을 시작합니다. Screen Continuity는 이 프로세스를 가로채서 주요 데이터를 저장합니다.

상태 저장의 주요 메서드는 onRetainNonConfigurationInstance이며, Activity가 소멸되기 전에 호출됩니다. 개발자는 여기에 데이터 모델, 목록 위치 및 현재 탐색 화면을 저장합니다. 재생성 후 Activity는 getLastNonConfigurationInstance를 통해 이 데이터를 수신하고 접기 전과 정확히 동일하게 UI를 복원합니다.

Fragments의 경우 메커니즘은 setRetainInstance(true)를 통해 구현되며, 구성 변경 시 fragment가 소멸되는 것을 방지합니다. Jetpack Compose에서는 Window Metrics 변경 시 자동으로 상태를 저장하는 rememberSaveable이 사용됩니다.

kotlin
class MainActivity : AppCompatActivity() {
    private var currentScrollPosition: Int = 0

    override fun onRetainNonConfigurationInstance(): Any {
        return SavedState(scrollPosition = currentScrollPosition)
    }

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        val saved = lastNonConfigurationInstance as? SavedState
        saved?.let { currentScrollPosition = it.scrollPosition }
    }
}

Jetpack WindowManager의 ScreenContinuity API

Jetpack WindowManager 버전 1.1+에는 화면 연속성 관리를 위한 준비된 메커니즘을 제공하는 ScreenContinuityController 클래스가 포함되어 있습니다. API는 자동으로 포즈 변경을 처리하고 콜백 인터페이스를 통해 앱에 알립니다.

ScreenContinuityController

포즈 변경 리스너를 등록하는 중앙 클래스입니다. registerContinuityListener는 폴더블 디바이스 상태 간의 각 전환에서 실행되는 콜백을 수락합니다. 컨트롤러는 getCurrentFoldingFeature 메서드를 통해 현재 포즈에 대한 정보도 제공합니다.

FoldingFeatureAdapter

FoldingFeature 데이터를 앱이 읽을 수 있는 상태로 변환하는 유틸리티 클래스입니다. FoldingFeatureAdapter는 힌지 좌표를 정규화하고 현재 포즈가 HALF_OPENED, FLAT 또는 TABLE_TOP인지 결정합니다. 이는 개발자가 수동으로 각도와 임계값을 계산할 필요가 없게 합니다.

Jetpack Compose와의 통합

Compose 앱의 경우 WindowManager는 접힘을 고려한 WindowSizeClass 및 수정자를 제공합니다. BoxWithConstraints 구성 요소는 Activity 재생성 없이 실시간으로 화면 크기 변경에 적응합니다. Compose는 WindowMetrics가 변경될 때 자동으로 재구성을 트리거합니다.

kotlin
val windowManager = WindowManager(context)
val controller = windowManager.screenContinuityController

controller.registerContinuityListener { feature: FoldingFeature ->
    when (feature.state) {
        FoldingFeature.State.HALF_OPENED -> enterTabletopMode()
        FoldingFeature.State.FLAT -> expandToTablet()
    }
}

Kotlin 구현 예제

Screen Continuity를 지원하는 완전한 Activity 예제를 살펴보겠습니다. MainActivity는 접기, 펼치기 및 반쯤 접힌 상태의 세 가지 시나리오를 처리합니다. 데이터는 onRetainNonConfigurationInstance를 통해 저장되고 재생성 시 복원됩니다.

kotlin
class ContinuityActivity : AppCompatActivity() {
    private lateinit var binding: ActivityContinuityBinding
    private var itemList = mutableListOf<String>()

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

        val savedState = lastNonConfigurationInstance as? ContinuityState
        if (savedState != null) {
            itemList.addAll(savedState.items)
            restoreUi(savedState)
        }
        setupWindowManager()
    }

    private fun setupWindowManager() {
        val controller = WindowManager(this).screenContinuityController
        controller.registerContinuityListener { feature ->
            updateLayoutForFeature(feature)
        }
    }

    private fun updateLayoutForFeature(feature: FoldingFeature) {
        when (feature.state) {
            FoldingFeature.State.HALF_OPENED -> binding.root.enableTabletopMode()
            FoldingFeature.State.FLAT -> binding.root.enableTabletMode()
            FoldingFeature.State.TABLE_TOP -> binding.root.enableTouchpadMode()
        }
    }

    override fun onRetainNonConfigurationInstance(): Any {
        return ContinuityState(itemList.toList(), binding.listView.firstVisiblePosition)
    }
}

data class ContinuityState(
    val items: List<String>,
    val scrollPosition: Int
)

핵심 요소는 항목 목록과 스크롤 위치를 저장하는 ContinuityState 클래스입니다. Activity는 재생성 전에 이를 저장하고 onCreate 호출 직후 복원합니다. WindowManager 컨트롤러는 포즈 변경을 구독하고 모드 간에 레이아웃을 전환합니다.

에뮬레이터 및 디바이스에서 연속성 테스트

Android Studio는 세 가지 포즈를 모두 지원하는 폴더블 디바이스 에뮬레이터를 제공합니다. Screen Continuity를 테스트하려면 Pixel Fold 또는 Samsung Galaxy Z Fold 유형의 가상 디바이스를 만들고 에뮬레이터 제어판을 통해 포즈를 전환하면 됩니다.

에뮬레이터 설정

Foldable 카테고리로 AVD를 만들고 7.6인치 화면 해상도를 선택합니다. 에뮬레이터의 고급 제어에서 Folding Postures 탭을 열고 포즈 간에 전환합니다. 각 전환은 configuration change를 트리거하며 앱이 올바르게 처리해야 합니다.

실제 디바이스

실제 디바이스(Galaxy Z Fold 5, Pixel Fold)에서는 물리적으로 접고 펼쳐서 테스트합니다. Samsung DeXMulti-Window 모드도 연속성을 활성화합니다. 디버깅을 위해 ADB 명령 adb shell dumpsys window policy를 사용하여 현재 접힘 상태를 확인합니다.

일반적인 문제

주요 오류로는 RecyclerView 상태 손실, 텍스트 필드 내용 재설정 및 대화 상자 창 닫힘이 있습니다. ViewModel은 Activity 라이프사이클과 독립적으로 메모리에 데이터를 유지하여 이러한 문제를 해결합니다. 앱이 수동으로 변경을 처리하는 경우 매니페스트에서 Activity에 android:configChanges 매개변수로 주석을 추가하는 것도 중요합니다.

xml
<!-- AndroidManifest.xml -->
@android:configChanges="screenSize|smallestScreenSize|screenLayout|orientation"

자주 묻는 질문

Screen Continuity는 일반 상태 저장과 어떻게 다른가요?

Screen Continuity는 회전뿐만 아니라 화면 크기의 물리적 변경 시 상태를 저장합니다. 일반 onSaveInstanceState는 폴더블 디바이스 포즈 전환 시 상태 보존을 보장하지 않지만, ScreenContinuityController는 이 특정 시나리오를 처리합니다.

어떤 Android 디바이스가 Screen Continuity를 지원하나요?

Android 10+ 및 Google Play Services가 있는 모든 폴더블 디바이스. Pixel Fold, Galaxy Z Fold 시리즈, Huawei Mate X, Oppo Find N 및 OnePlus Open에 지원이 포함됩니다. Jetpack WindowManager 버전 1.1 이상이 필요합니다.

Screen Continuity는 Jetpack Compose와 어떻게 작동하나요?

Jetpack Compose는 rememberSaveable 및 WindowSizeClass를 통해 Screen Continuity를 지원합니다. 컴포지션은 WindowMetrics 변경에 자동으로 응답하며, rememberSaveable은 재구성 간에 상태를 보존합니다. onSizeChanged 수정자를 사용하면 실시간으로 크기 변경을 추적할 수 있습니다.

Screen Continuity를 구현하지 않으면 어떻게 되나요?

디바이스를 펼치거나 접으면 Activity가 상태를 저장하지 않고 다시 생성됩니다. 사용자는 입력한 데이터를 잃고, 스크롤이 재설정되며, 열린 대화 상자가 닫힙니다. 이로 인해 Google Play에서 부정적인 리뷰와 앱 평점 하락이 발생합니다.

실제 디바이스 없이 Screen Continuity를 테스트하는 방법은?

Android Emulator는 폴더블 디바이스 시뮬레이션을 지원합니다. Pixel Fold 유형의 AVD를 만들고 Extended Controls를 열어 Folding Postures 탭을 선택합니다. 포즈 전환 시 configuration change가 트리거되어 실제 디바이스 없이 상태 보존을 테스트할 수 있습니다.

요약

  • Screen Continuity — 폴더블 디바이스의 물리적 구성 변경 시 Activity 상태를 보존하는 Android 메커니즘입니다.
  • Jetpack WindowManager는 HALF_OPENED, FLAT, TABLE_TOP 포즈를 추적하는 ScreenContinuityController를 제공합니다.
  • onRetainNonConfigurationInstance — 펼칠 때 Activity 재생성 전 데이터를 보존하는 기본 메서드입니다.
  • ViewModel 및 Compose의 rememberSaveable은 수동 라이프사이클 관리 없이 상태 손실을 해결합니다.
  • Android Studio 에뮬레이터를 사용하면 실제 디바이스 없이 모든 폴더블 디바이스 포즈를 테스트할 수 있습니다.
  • 무시 Screen Continuity를 무시하면 접을 때 UI 재설정 및 입력 데이터 손실이 발생합니다.
  • 권장 폴더블 디바이스 및 태블릿을 대상으로 하는 모든 앱에 연속성 지원을 추가하는 것이 좋습니다.

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

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

프로젝트 논의

더 읽어보기