본문 바로가기
Android Studio

[Android 앱개발 입문] 액티비티 생명주기 (# 추가하기)

by 젼젼39 2024. 3. 21.

1. 액티비티 생명주기

 

2. 액티비티의 수명

1) onCreate() : 액티비티가 생성되어 레이아웃 설정 등을 수행

2) onDestroy() : 호출되는 시점에 사용하고 있는 리소스를 모두 해제하고 생을 마감

 

3. 액티비티의 화면이 눈에 보이게 되는 Visibility

    - onStart() 와 onStop() 호출 사이에 있고,
        이 기간 중에는 사용자가 액티비티를 화면에서 보고 이와 상호작용할 수 있음

    - 시스템은 액티비티의 전체 수명 내내 onStart() 및 onStop()을 여러 번 호출할 수 있음
        (액티비티는 사용자에게 표시되었다가 숨겨지는 상태를 오가게 됨)

 

4. 액티비티가 foreground에서 동작하는 구간

    - onResume()에서 onPause() 호출 사이를 말하고,
        이 기간엔 이 액티비티가 화면에서 다른 모든 액티비티 앞에 표시됨
        (사용자 입력도 여기에 집중됨)

    - 액티비티는 전경에 나타났다 숨겨지는 전환을 자주 반복할 수 있음
        (ex. 기기가 절전모드에 들어가거나 대화상자가 나타날 경우 onPause()가 호출됨)

 

5. 수명주기 콜백 메소드

    - 라이프 사이클 콜백 메소드 : 액티비티가 생성되면서 해제될때까지 액티비티의 상태에 따라서 불려지는 메소드

    - 애플리케이션 개발자는 필요한 경우에 해당 콜백 메소드를 재정의해 필요한 일을 수행하게 할 수 있음

1) onCreate() : 반드시 구현해야 하는 메소드로서 액티비티가 생성되면서 호출됨
        - 가장 중요한 작업은 화면을 setContentView()를 호출해 설정하는 것

2) onPause() : 사용자가 액티비티를 떠나고 있을 때 호출됨
        - 액티비티가 완전히 소멸되는 것은 아니지만, 사용자가 돌아오지 않을 수 있기에 그동안 이루어진 변경사항을 저장

 

6. 액티비티 전환 시 수명주기 콜백 메소드 호출 순서

1) FirstActivity에서 SecondActivity 시작

(1) FirstActivity 의 onPause()

(2) SecondActivit의 onCreate() -> onStart() -> onResume()

(3) FirstActivity의 onStop()

 

2) 단말기의 뒤로가기 버튼 누름

(1) SecondActivity의 onPause()

(2) FirstActivity의 onRestart(), onStart(), onResume()

(3) SecondActivity의 onStop(), onDestroy()

 

 

 // 실습

* 로그 출력 시 TAG의 Lifecycle을 입력 시, 필터에 입력된 로그만 표시됨...?

package com.example.acrivityintent2

import android.content.Intent
import android.net.Uri
import android.os.Bundle
import android.util.Log
import android.view.View
import android.widget.Button
import android.widget.EditText
//import androidx.activity.enableEdgeToEdge
import androidx.appcompat.app.AppCompatActivity
//import androidx.core.view.ViewCompat
//import androidx.core.view.WindowInsetsCompat

class FirstActivity : AppCompatActivity() {

    val TAG = "FirstActivity_Lifecycle"     //여기 추가!

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        //enableEdgeToEdge()
        setContentView(R.layout.activity_first)
//        ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.main)) { v, insets ->
//            val systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars())
//            v.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom)
//            insets
//        }

        Log.i(TAG, "onCreate()")    //여기 추가!

        val btn = findViewById<Button>(R.id.buttonFirstActivity)
        btn.setOnClickListener {
            val intent = Intent(this, SecondActivity::class.java)
            startActivity(intent)
        }

        //명시적 인텐트
        val btn_call3 = findViewById<Button>(R.id.buttonThirdActivity)
        btn_call3.setOnClickListener {
            //id가 edit_data인 EditText 객체
            val edit_text = findViewById<EditText>(R.id.edit_data)
            //그 객체 안에 입력된 문자열 값을 가져옴
            val strData = edit_text.text.toString()
            //인텐트 객체 생성 (세번째 액티비티를 여기서 실행할거다)
            val intent = Intent(this, ThirdActivity::class.java)
            //가져온 문자열 값을 앞에서 생성한 인텐트 객체의 Extra에 설정 (이름은 dataFromFirstActivity로 설정)
            intent.putExtra("dataFromFirstActivity",strData)
            //startActivity()의 파라미터로 인텐트 객체 전달
            startActivity(intent)

        }

    }
    fun doOnBtnClick(view: View){
        when(view.id){
            R.id.buttonDialActivity -> {
                val call_intent = Intent(Intent.ACTION_DIAL, Uri.parse("tel:114"))
                startActivity(call_intent)
            }
            R.id.buttonMapActivity -> {
                val map_intent = Intent(Intent.ACTION_VIEW, Uri.parse("geo:37.565350, 127.01445"))
                startActivity(map_intent)
            }
        }
    }


    override fun onStart() {
        super.onStart()
        Log.i(TAG, "onStart()")
    }

    override fun onResume() {
        super.onResume()
        Log.i(TAG, "onResume()")
    }

    override fun onPause() {
        super.onPause()
        Log.i(TAG, "onPause()")
    }

    override fun onStop() {
        super.onStop()
        Log.i(TAG, "onStop()")

        //SecondActivity가 onResume()된 후 First는 onStop상태임.
        //이 때, 백그라운드의 무언가 노래 등을 멈추게 하는 코드 작성...
    }

    override fun onRestart() {
        super.onRestart()
        Log.i(TAG, "onRestart()")
    }

    override fun onDestroy() {
        super.onDestroy()
        Log.i(TAG, "onDestroy()")
    }

}

 

package com.example.acrivityintent2

import android.os.Bundle
import android.util.Log
import android.widget.Button
//import androidx.activity.enableEdgeToEdge
import androidx.appcompat.app.AppCompatActivity
//import androidx.core.view.ViewCompat
//import androidx.core.view.WindowInsetsCompat

class SecondActivity : AppCompatActivity() {

    val TAG = "SecondActivity_Lifecycle"     //여기 추가!

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        //enableEdgeToEdge()
        setContentView(R.layout.activity_second)
//        ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.main)) { v, insets ->
//            val systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars())
//            v.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom)
//            insets
//        }
        Log.i(TAG, "onCreate()")        //여기 추가!

        val btn = findViewById<Button>(R.id.buttonSecondActivity)
        btn.setOnClickListener{
            finish()
        }
    }


    override fun onStart() {
        super.onStart()
        Log.i(TAG, "onStart()")
    }

    override fun onResume() {
        super.onResume()
        Log.i(TAG, "onResume()")
    }

    override fun onPause() {
        super.onPause()
        Log.i(TAG, "onPause()")
    }

    override fun onStop() {
        super.onStop()
        Log.i(TAG, "onStop()")
    }

    override fun onRestart() {
        super.onRestart()
        Log.i(TAG, "onRestart()")
    }

    override fun onDestroy() {
        super.onDestroy()
        Log.i(TAG, "onDestroy()")

        //메모리 해지 등을 여기에 넣으면 됨
    }
}