-
[Android] Activity와 라이프사이클(Lifecycle) 생명주기, 4대 컴포넌트안드로이드 2024. 3. 20. 16:04
✏️ TIL(Today I Learned)
Activity의 Lifecycle에 대해 배우면서 이를 이해하기 위해 어플리케이션을 하나 만들었다. 두 번째 액티비티 시작버튼을 클릭하면 SecondActivity로 화면이 전환된다. EditText에 테스트를 입력한 뒤, 세 번째 액티비티에 데이터 전달버튼을 클릭하면 ThirdActivity가 시작되고 FirstActivity에서 입력한 테스트를 가져와서 보여준다. 그리고 닫기 버튼을 클릭하면 finish()를 호출해 액티비티를 종료하게 했다.
FirstActivity와 SecondActivity에는 액티비티의 생의주기를 알아보기 위해서 태그와 함께 콜백메소드를 사용해서 로그 캣 에 로그가 출력되도록 했다.
val TAG = "SecondActivity_Lifecycle" 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()") }
FirstActivity에서 두번째 액티비티 시작버튼을 클릭하니, SecondActivity가 시작되면서 아래와 같은 로그가 출력됐다. FirstActivity가 일시정지 상태가 되고 SecondActivity가 생성되고 사용자에게 표시되면서 상호작용할 수 있는 상태가 됐다. 그 후, FirstActivity는 더 이상 사용자에게 표시되지 않게 된 것이다.
그리고 SecondActivity에서 애뮬레이터의 뒤로 가기를 누르자, SecondActivity가 일시정지 상태가 되고 FirstActivity가 onStop() 상태에서 다시 액티비티가 시작했으므로 onRestart()가 호출됐다. FirstActivity는 다시 사용자에게 표시되면서 상호작용할 수 있는 상태가 됐다. 그 후, SecondActivity는 사용자에게 표시되지 않게 되고 파괴되었다.
입력한 데이터를 주고 받을 때는 Intent를 사용했다. FirstActivity에서 putExtra() 메소드를 통해 dataFromFirstActivity라는 키에 strData 데이터를 넣고, ThirdActivity에서 getStringExtra() 메소드로 동일한 dataFromFirstActivity 키에 대한 데이터를 문자열으로 가져왔다.
// FirstActivity val btn_call3 = findViewById<Button>(R.id.buttonThirdActivity) btn_call3.setOnClickListener { val edit_text = findViewById<EditText>(R.id.edit_data) val strData = edit_text.text.toString() val intent = Intent(this, ThirdActivity::class.java) intent.putExtra("dataFromFirstActivity",strData) startActivity(intent) } // ThirdActivity val strData = intent.getStringExtra("dataFromFirstActivity") val editText = findViewById<EditText>(R.id.editText) editText.setText(strData)
이 어플리케이션을 만들면서 액티비티의 생애주기에 대해 이해할 수 있었다. 지금까지는 생의주기를 고려하지 않았고 액티비티를 전환할 때, 필요 없어진 액티비티에서 finish()를 호출하지도 않았었다. 리소스를 꽤 많이 낭비한 것 같다. 이를 바탕으로 다음 어플리케이션을 만들 때, 생애주기를 고려해 메모리를 더 효율적으로 활용해보려고 한다.
📝 공부한 Kotlin 정리
1. 액티비티 (Activity)
1.1 안드로이드 4대 컴포넌트
안드로이드 애플리케이션은 주로 네 가지 주요 컴포넌트로 구성된다. 이들은 애플리케이션의 구조를 정의하고, 안드로이드 시스템과 어떻게 상호 작용하는지를 결정한다.
- 액티비티 (Activity)
- 설명: 액티비티는 사용자가 직접 상호작용하는 화면이다. 예를 들어 이메일 앱에서는 이메일 목록을 보여주는 화면, 이메일 작성 화면 등이 각각 독립된 액티비티이다.
- 역할: 사용자 인터페이스(UI)를 담당하며, 사용자의 입력에 반응하는 이벤트 기반 프로그래밍을 가능하게 한다.
- 서비스 (Service)
- 설명: 서비스는 백그라운드에서 오랜 시간 동안 실행되어야 하는 작업을 수행한다. 예를 들어 음악 재생이나 파일 다운로드 등이 서비스로 처리된다.
- 역할: 사용자가 직접적으로 인지하지 못하는, 애플리케이션의 '백스테이지'에서 일어나는 작업을 담당한다.
- 브로드캐스트 리시버 (Broadcast Receiver)
- 설명: 브로드캐스트 리시버는 안드로이드 시스템으로부터 발송되는 다양한 이벤트나 정보를 애플리케이션이 받을 수 있게 해주는 컴포넌트이다. 예를 들어, 배터리 부족 경고, 화면 꺼짐 등의 시스템 이벤트를 처리할 때 사용된다.
- 역할: 애플리케이션은 브로드캐스트 메시지를 구독하고, 해당 이벤트가 발생했을 때 반응할 수 있다.
- 콘텐트 프로바이더 (Content Provider)
- 설명: 콘텐트 프로바이더는 애플리케이션 간의 데이터 공유를 가능하게 한다. 예를 들어, 연락처 애플리케이션이 다른 애플리케이션에 연락처 데이터를 제공할 때 사용된다.
- 역할: 데이터를 저장하고 관리하는 일종의 데이터베이스 역할을 하며, 다른 애플리케이션에 안전하게 데이터를 공유한다.
이 4대 컴포넌트를 이해하는 것은 안드로이드 애플리케이션의 기본적인 구조를 파악하는 데 매우 중요하다. 각 컴포넌트는 독립적인 기능을 가지면서도 서로 긴밀하게 연동되어, 복잡하고 다양한 기능의 애플리케이션을 만들 수 있는 기반을 제공한다.
2. 액티비티 생명주기
2.1 액티비티 생명주기 개요
액티비티 생명주기는 앱이 실행되는 동안 액티비티가 거치는 다양한 상태를 말한다. 각 상태에는 해당하는 콜백 메소드가 있으며, 이를 재정의하여 앱의 동작을 제어할 수 있다.
2.2 액티비티의 수명
onCreate()호출과 onDestroy() 호출 사이을 말한다.
- onCreate():
액티비티가 처음 생성될 때 호출된다. 액티비티 초기화 및 UI 구성 등의 작업을 수행한다. - onDestroy():
액티비티가 파괴되기 직전에 호출된다. 액티비티의 리소스를 해제하고 정리하는 작업을 수행한다.
2.3 액티비티의 화면이 눈에 보이게 되는 Visibility
onStart()에서 onStop()호출 사이를 말한다. 이 기간 중에는 사용자가 액티비티를 화면에서 보며 상호 작용 할 수 있다.
onStop()이 호출되어 새 액티비티가 시작되면 이 액티비티는 더 이상 표시되지 않게 된다. 시스템은 액티비티의 전체 수명 내내 onStart() 및 onStop()을 여러 번 호출할 수 있다. 이때 액티비티는 사용자에게 표시되었다 숨겨지는 상태를 오가게 된다.
- onStart():
액티비티가 사용자에게 보여지기 시작할 때 호출된다. 액티비티가 화면에 표시되기 직전에 실행되는 단계이다. - onStop():
액티비티가 더 이상 사용자에게 표시되지 않을 때 호출된다. 다른 액티비티가 사용자 화면을 완전히 가릴 때 onStop()이 호출된다. - onRestart():
onStop() 상태에서 다시 액티비티가 시작될 때 호출된다. 이 메소드 다음에 onStart()가 호출된다.
2.4 액티비티가 foreground에서 동작하는 구간
onResume()에서 onPause()호출 사이를 말한다. 이 기간 중에는 이 액티비티가 화면에서 다른 모든 액티비티 앞에 표시된다. 사용자 입력도 여기에 집중된다. 액티비티는 전경에 나타났다 숨겨지는 전환을 자주 반복할 수 있다.
예를 들어, 기기가 절전모드에 들어가거나 대화상자가 나타나면 onPause()가 호출된다.
- onResume():
액티비티가 사용자와 상호작용을 시작하고 활성 상태가 될 때 호출된다. 액티비티가 포그라운드에 있고 사용자와 상호작용할 수 있는 상태이다. - onPause():
다른 액티비티가 포그라운드로 올라오거나, 현재 액티비티가 일부분만 보이게 될 때 호출된다. 액티비티는 일시 정지 상태가 되며, 화면에 보이지 않게 됩니다. 이때 CPU 리소스가 부족한 상황에서 액티비티가 종료될 수 있다.
2.5 액티비티 전환 시 수명주기 콜백 메소드 호출 순서
- FirstActivity에서 SecondActivity 시작
- 단말기의 뒤로가기 버튼 누름
'안드로이드' 카테고리의 다른 글
[Android] registerForActivityResult() 사용한 회원가입 & 로그인 (0) 2024.03.21 [Android] AAB(Android App Bundle)에서 구글 로그인이 안 되는 문제 해결 (0) 2024.03.21 [Android] Activity와 인텐트(Intent) (0) 2024.03.20 [Android] 안드로이드 UI 기본 - 위젯(Widget) (0) 2024.03.19 [Android] 어플리케이션 구성 파일 (0) 2024.03.18