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()")
//메모리 해지 등을 여기에 넣으면 됨
}
}
'Android Studio' 카테고리의 다른 글
[Android 앱개발 숙련] 뷰 바인딩 - 개념, 설정방법 (# 추가하기) (0) | 2024.04.09 |
---|---|
안드로이드 스튜디오 TTS 관련 코드 (0) | 2024.04.08 |
[Android 앱개발 입문] 액티비티 간의 데이터 전달 (# 추가하기) (0) | 2024.03.21 |
[Android 앱개발 입문] Intent (# 추가하기) (0) | 2024.03.20 |
[Android 앱개발 입문] 액티비티 (# 추가하기) (0) | 2024.03.20 |