[Android] The activity lifecycle

Taewoo Kim·2023년 1월 10일
0

[Android]

목록 보기
8/9

생명주기

생명주기

위의 링크에 매우 간략하게 생명주기에 대한 설명을 적어 놓았다.

임시 UI 상태 저장 및 복원 (화면 전환에 따른 데이터 상태 저장)

유저는 활동의 UI상태가 회전 또는 멀티 윈도우 모드로의 전환과 같은 구성 변경이 발생할 때 데이터의 변화가 일어나지 않게 하기 위해 어떻게 해야하는지에 대한 내용이다.

시스템이 구성 변경이 발생되면 Activity가 소멸되어 모든 UI 상태를 제거한다.

시스템 제약으로 Activity가 소멸되면 Viewmodel, onSaveInstanceState()로컬 저장소에 데이터 저장 등 3가지 방법이 존재한다.

onSaveInstance() 메서드를 통해 원시 데이터나 간단한 객체와 같은 UI 데이터가 간단하고 가벼울 경우 onSaveInstanceState()만으로도 모든 구성 변경 및 시스템이 시작한 프로세스가 종료된 상황에서 UI 상태를 보존할 수 있다.

그러나 onSaveInstanceState()는 직렬화/역직렬화 비용을 발생하기 때문에 ViewModel과 onSaveInstanceState()를 같이 사용해야 함.

OnSaveInstanceState() 예시

package com.twent.part1.chapter2

import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.os.PersistableBundle
import android.util.Log
import android.widget.Button
import android.widget.TextView

var number = 0
class MainActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        val numberTextView = findViewById<TextView>(R.id.numberTextView)
        val resetButton = findViewById<Button>(R.id.resetButton)
        val plusButton = findViewById<Button>(R.id.plusButton)

        resetButton.setOnClickListener {
            number = 0
            numberTextView.text = number.toString()
            Log.d("onClick", "리셋 버튼이 클릭 됐습니다.")
        }

        plusButton.setOnClickListener {
            number++
            numberTextView.text = number.toString()
            Log.d("onClick", "플러스 된 숫자 $number")
        }

        if(savedInstanceState != null)
        {
            number = savedInstanceState.getInt("number");
            Log.d("savedInstanceState", "저장된 숫자 $number")
            numberTextView.text = number.toString()
        }
    }

    override fun onSaveInstanceState(outState: Bundle) {
        super.onSaveInstanceState(outState)
        Log.d("savedInstanceState", "저장될 숫자 $number")
        outState.putInt("number", number)
    }
}

git : 예제코드 깃허브

위의 예시 코드는 숫자 세기 예제 코드로 화면이 회전해도 데이터가 그대로 보존되는 것을 확인할 수 있다.

0개의 댓글