[Android] 액티비티 생명주기

leeeha·2022년 9월 18일
0
post-thumbnail

출처: https://sesac.seoul.kr/ (JetPack과 Kotlin을 활용한 Android App 개발 강의)

액티비티의 생명주기

  • 활성 상태: 액티비티의 화면이 출력되고 있고, 유저가 이벤트를 발생시킬 수 있는 상태
  • 일시정지 상태: 액티비티의 화면이 출력되고 있지만, 유저가 이벤트를 발생시킬 수 없는 상태
  • 비활성 상태: 액티비티의 화면이 출력되고 있지 않은 상태

활성 상태

  • Activity launched : 인텐트에 의해 액티비티 객체가 생성된다.
  • onCreate(), onStart(), onResume() : onCreate()는 최초에 한번만 호출되지만, onStart(), onResume()는 여러 번 호출될 가능성이 있다. 따라서, 최초의 뷰 출력을 위한 setContentView() 함수는 보통 onCreate()에서 호출한다. (필요에 따라 onStart, onResume에서도 호출할 수 있음.)
  • Activity running : 활성 상태

일시정지 상태

  • onPause()가 호출되어 일시정지 상태에 있다가 활성 상태로 다시 돌아갈 때는 onResume()가 호출된다.

  • 대표적인 예시: 오버뷰 버튼을 눌러서 화면을 분할하는 경우, 원래의 액티비티 화면은 일시정지 상태가 된다. (화면이 여전히 보이긴 하지만, 포커스는 새로운 액티비티로 옮겨갔기 때문에 유저 이벤트에 반응하지 않는다.)

비활성 상태

  • 액티비티 객체는 여전히 살아있지만, 화면이 보이지 않는 상태
  • A에서 B로의 화면 전환: A는 비활성 상태, B는 활성 상태

  • 대표적인 예시: 홈 버튼을 눌러서 런처 앱을 띄웠을 때 원래의 액티비티는 종료되지 않는다. 단지 화면이 보이지 않을 뿐이다.


액티비티의 상태 저장

  • 액티비티가 종료되면, 액티비티의 데이터는 모두 사라진다.
  • 다시 실행 시 복원시켜야 하는 데이터가 있다면, 상태 저장 기법을 이용해야 한다.
  • 잠깐 저장해뒀다가 다시 복원시키고 싶은 데이터를 데이터베이스에 저장하기는 부담스럽다.
  • 대표적인 예시: 화면 회전

Bundle

  • onCreate(), onSaveInstanceState(), onRestoreInstanceState()의 매개변수
  • Map 객체와 유사한 형태 (key, value)

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:gravity="center"
    tools:context=".MainActivity">

    <TextView
        android:id="@+id/countView"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="0"
        android:textSize="30sp"
        android:textStyle="bold" />

    <Button
        android:id="@+id/button"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="plus"
        android:layout_marginTop="30dp"/>

    <EditText
        android:id="@+id/edit"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginTop="16dp"/>

</LinearLayout>
package com.tutorial.c45

import android.os.Bundle
import android.widget.Button
import android.widget.EditText
import android.widget.TextView
import androidx.appcompat.app.AppCompatActivity

class MainActivity : AppCompatActivity() {
    var count = 0
    lateinit var countView: TextView
    lateinit var editView: EditText

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

        countView = findViewById(R.id.countView)
        val button = findViewById<Button>(R.id.button)
        editView = findViewById(R.id.edit)

        button.setOnClickListener {
            count++
            countView.text = "$count"
        }
    }
}

EditText는 내부적으로 캐싱이 되어서 값이 저장되지만 TextView의 값은 저장되지 않는 것을 확인할 수 있다.

package com.tutorial.c45

import android.os.Bundle
import android.widget.Button
import android.widget.EditText
import android.widget.TextView
import androidx.appcompat.app.AppCompatActivity

class MainActivity : AppCompatActivity() {
    var count = 0
    lateinit var countView: TextView
    lateinit var editView: EditText

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

        countView = findViewById(R.id.countView)
        val button = findViewById<Button>(R.id.button)
        editView = findViewById(R.id.edit)

        button.setOnClickListener {
            count++
            countView.text = "$count" // 상태 변경 
        }
    }

	// 상태 저장 
    override fun onSaveInstanceState(outState: Bundle) {
        super.onSaveInstanceState(outState)
        outState.putInt("count", count)
        outState.putString("edit", editView.text.toString())
    }

	// 상태 복원 
    override fun onRestoreInstanceState(savedInstanceState: Bundle) {
        super.onRestoreInstanceState(savedInstanceState)
        count = savedInstanceState.getInt("count")
        countView.text = "$count"
        editView.setText(savedInstanceState.getString("edit"))
    }
}

profile
습관이 될 때까지 📝

0개의 댓글