[Android] 화면 회전과 같은 구성 변경이 발생할 때 Activity에 생기는 변화

2025. 8. 31. 15:12·Android

안드로이드에서 구성 변경(ex. 화면 회전, 테마 변경, 글꼴 크기 조정 또는 언어 업데이트)이 발생하면 시스템은 새 구성을 적용하기 위해 현재 Activity를 종료하고 다시 실행하게 됩니다. 이러한 동작은 앱의 리소스가 변경된 구성을 새롭게 반영하고 앱이 다시 로드되도록 보장합니다.

 

📑 구성 변경 중 기본 동작

  1. Activity 종료 및 재시작
    구성 변경이 발생하면 Activity가 종료된 다음 재시작됩니다.
    1) 시스템은 현재 실행 중인 Activity의 onPause() > onStop() > onDestroy() 메서드를 순차적으로 호출
    2) 구성 변경이 완료되면 Activity는 재시작되고, onCreate() 메서드가 호출됨
  2. 리소스 재로드
    시스템은 새 구성에 따라 리소스(ex. 레이아웃, Drawable, 문자열)를 다시 로드하여 앱이 화면 방향, 테마 또는 언어와 같은 변경 사항이 반영될 수 있도록 합니다.
  3. 데이터 손실 방지
    개발자는 재생성 중 데이터 손실을 방지하기 위해 onSaveInstanceState() 또는 onRestoreInstanceState() 메서드를 사용하거나 viewModel을 활용하여 인스턴스 상태를 저장하고 복원할 수 있습니다.
    예를 들어, 화면 회전이 발생하는 경우 액티비티의 라이프 사이클은 아래와 같이 호출됩니다.
onPause() → onSaveInstanceState() → onStop() → onDestory() → onCreate() → onStart() → onResume()

그래서 보존이 필요한 정보는 아래와 같이 onSaveInstanceState()에서 outState 번들에 저장한 후, onCreate()의 파라미터인 savedInstanceState 번들에서 꺼내어 사용할 수 있습니다.

override fun onSaveInstanceState(outState: Bundle) {
    super.onSaveInstanceState(outState)
    outState.putString("user_input", editText.text.toString())
}

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_main)

    val restoredInput = savedInstanceState?.getString("user_input")
    editText.setText(restoredInput)
}

마찬가지로 fragment에서도 onSaveInstanceState을 이용하여 기존 데이터를 유지할 수 있습니다.

 

📑 액티비티가 재생성 되는 경우

  1. 화면 회전
    화면 방향을 세로/가로로 변경하여 새 크기게 맞게 레이아웃을 다시 로드합니다.
  2. 다크/라이트 테마 변경
    사용자가 다크 모드와 라이트 모드 간에 전환하면 앱은 테마별 리소스(ex. color, styles)를 다시 로드합니다.
  3. 글꼴 크기 변경
    기기의 글꼴 크기 설정 조정은 새 배율을 반영하도록 텍스트 리소스를 다시 로드합니다.
  4. 언어 변경
    시스템 언어 업데이트는 현지화된 리소스(ex. 다른 언어의 문자열)를 다시 로드합니다.
  5. 앱 디스플레이 크기 변경
    기기를 접거나 펴는 등의 디스플레이 크기 변경이 발생하면 리소스를 다시 로드합니다.

 

📑 액티비티 재생성 피하기

시스템은 새 기기의 구성과 일치하는 리소스로 애플리케이션을 자동 새로고침하여 애플리케이션이 새 구성에 맞게 조정되도록 지원합니다. 하지만 앱이 특정 구성 변경 중에 리소스를 업데이트하지 않아도 되거나, 성능 제한이 있는 경우 개발자가 구성 변경을 직접 처리한다고 선언하여 시스템이 활동을 다시 시작하지 못하도록 할 수 있습니다.
Activity를 다시 시작하지 않고 구성 변경을 처리하려면 AndroidManifest.xml에서 android:ConfigChanges 속성을 추가하면 됩니다. 이 방식은 변경 사항을 개발자가 수동적으로 처리하는 형태로 책임을 개발자에게 위임합니다.
아래의 매니페스트 코드는 화면 방향과 키보드 사용 가능 여부가 변경될 때 MyActivity의 Activity 재생성을 사용 중지합니다.

<activity
    android:name=".MyActivity"
    android:configChanges="orientation|screenSize|screenLayout|keyboardHidden"
    android:label="@string/app_name">

이렇게 되면 시스템은 Activity를 소멸시키고 다시 생성하지 않습니다. 대신 onConfigurationCHanged() 메서드가 호출되어 개발자가 변경 사항을 수동으로 처리할 수 있게 됩니다.

override fun onConfigurationChanged(newConfig: Configuration) {
    super.onConfigurationChanged(newConfig)

    if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE) {
        // 화면이 가로로 변경된 경우 로직 처리
    } else if (newConfig.orientation == Configuration.ORIENTATION_PORTRAIT) {
        // 화면이 세로로 변경된 경우 로직 처리
    }
}

일부 구성 변경사항은 항상 액티비티가 재생성 되도록 강제하기 때문에 재생성을 피할 수 없습니다.(ex. DynamicColors)
또한, 재성성을 막는 경우 언어나 테마, 레이아웃 전환 등의 리소스가 자동 적용되지 않고 전부 수동으로 처리해야 하기 때문에 유지보수가 어려워지게 됩니다. 이러한 이유에서 구글은 View 시스템 기반 앱에서는 Activity 재생성 막는 것을 최후의 수단으로만 사용하도록 권고하고 있습니다.
따라서 특별한 이유(ex. 비디오 플레이어처럼 재생 중단되면 안 되는 경우)가 아니라면 기본 동작(재생성)을 그대로 두는 것이 권장되는 방식입니다.

 

🔗 참고

  • Manifest Android Interview
  • https://developer.android.com/guide/topics/resources/runtime-changes
반응형
저작자표시 비영리 변경금지 (새창열림)

'Android' 카테고리의 다른 글

[Android] 런타임 권한(runtime permissions) 처리  (1) 2025.09.14
[Android] SparseArray에 대하여  (0) 2025.09.14
[Android] ActivityManager란?  (0) 2025.09.13
getJSONArray vs OptJSONArray  (0) 2023.06.18
[Android] TTS(Text To Speech) 사용하기  (0) 2021.07.02
'Android' 카테고리의 다른 글
  • [Android] SparseArray에 대하여
  • [Android] ActivityManager란?
  • getJSONArray vs OptJSONArray
  • [Android] TTS(Text To Speech) 사용하기
yenim
yenim
    반응형
  • yenim
    FOREST, FOR REST
    yenim
  • 전체
    오늘
    어제
    • 분류 전체보기 (234)
      • Android (8)
      • Baekjoon (142)
        • 구현 (3)
        • 브루트포스 (10)
        • BFS (12)
        • DFS (13)
        • 백트래킹 (3)
        • DP (26)
        • 최소 스패닝 트리 (1)
        • 이분 탐색 (10)
        • 그리디 알고리즘 (12)
        • 투포인터 (2)
        • 슬라이딩 윈도우 (2)
        • 다익스트라 (1)
        • 시뮬레이션 (6)
        • 분할 정복 (3)
        • 문자열 (9)
        • 정렬 (6)
        • 탐색 (2)
        • 수학 (20)
        • 링크드리스트 (1)
      • 프로그래머스 (15)
        • 구현 (4)
        • 브루트포스 (4)
        • DFS (1)
        • DP (1)
        • HEAP (1)
        • 문자열 (3)
        • 해시 (0)
        • 비트 (1)
      • CS (39)
        • 개발상식 (9)
        • 자료구조 (8)
        • 네트워크 (7)
        • 운영체제 (5)
        • 데이터베이스 (4)
        • 디자인패턴 (1)
        • 알고리즘 (5)
      • Programming Languages (3)
        • C & C++ (2)
        • Kotlin (1)
      • 취준 (7)
      • Git (2)
      • Google Online Challenge (4)
      • 에러 해결 (6)
      • WEB (0)
      • NOTE (3)
      • DIARY (3)
      • 알고리즘 (1)
  • 블로그 메뉴

    • 🏡 HOME
    • ✏️ TIL
  • 링크

    • github
  • 공지사항

  • 인기 글

  • 태그

    깊이우선탐색
    다이나믹 프로그래밍
    DP
    BFS
    브루트포스
    CS
    명품 자바프로그래밍
    그래프
    프로그래머스
    코테
    그리디 알고리즘
    너비우선탐색
    백준
    문자열
    DFS
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.4
yenim
[Android] 화면 회전과 같은 구성 변경이 발생할 때 Activity에 생기는 변화
상단으로

티스토리툴바