nueijeel
[Android] Activity 생명주기 본문
안드로이드 애플리케이션은 컴포턴트로 구성되고 컴포넌트는 Activity, Service, Content Provider, Broadcast Receiver의 4가지 요소로 구분된다. 그 중 Activity는 화면 UI 구성하는 컴포넌트에 해당한다.
Activity는 눈에 보이는 독립적인 실행 단위로 생명주기가 있어 생성되고 소멸되기까지의 과정 속에서 상태가 계속 변한다.
Activity 클래스는 액티비티의 상태 변화를 알아차릴 수 있는 onCreate(), onStart(), onResume(), onPause(), onStop(), onDestroy()의 6가지 콜백 함수를 제공한다.
이 콜백 함수들을 구현함으로서 사용자가 앱 이용 중 발생할 수 있는 예외적인 상황(앱 사용 도중 전화가 와서 실행 중이던 앱 중단 등)에 대비해 앱을 안정적으로 구동되게 할 수 있다.
1. 콜백 함수
- onCreate
시스템이 액티비티를 처음 생성할 때 호출되는 메서드로 필수적으로 구현해야한다.
이 메서드에서는 전체 수명 주기 동안 한 번만 발생해야하는 이벤트를 처리할 수 있다.
onCreate 메서드의 매개변수로 savedInstanceState를 받는데 이는 액티비티의 이전 저장상태를 갖는 Bundle 객체로, 처음 생성되는 액티비티일 경우 객체의 값은 null이다.
액티비티에 레이아웃을 적용하는 setContentView() 메서드도 onCreate 메서드 내부에서 호출된다.
onCreate 메서드가 실행을 완료하면 Started 상태가 된다.
- onStart
시스템이 Started 상태가 되면 호출되는 메서드로, 액티비티가 사용자에게 보여지고 앱은 액티비티를 포그라운드에 보내 상호작용할 수 있도록 준비한다.
onStart 메서드가 실행 완료되면 Resumed 상태가 되며 onResume 메서드를 호출한다.
- onResume
시스템이 Resumed 상태가 되면 호출되는 메서드로, 이 상태에서 앱이 사용자와 상호작용한다.
이벤트로 인해 앱에서 포커스가 떠나지 않는 한 앱은 Resumed 상태에 머문다.
만약 앱 포커스에 방해가 되는 이벤트가 발생한다면 Paused 상태가 되며 시스템이 onPause 메서드를 호출한다.
- onPause
시스템이 사용자가 액티비티를 떠나는 것을 나타내는 신호로 onPause 메서드를 호출한다.
이 상태에서는 모든 활동이 중단되지만 아주 잠깐 실행되므로, 데이터를 저장해야하는 종료 작업은 onStop 메서드에서 수행되어야 한다.
여기서 Resumed 상태가 된다면 다시 onResume 메서드가 호출되지만, Stopped 상태가 되면 onStop 메서드가 호출된다.
- onStop
액티비티가 사용자에게 더이상 표시되지 않으면 Stopped 상태가 되고 onStip 메서드를 호출한다.
이 상태에서는 화면에 보이지 않을 때 실행할 필요가 없는 기능을 모두 정지할 수 있다. 또 앱이 사용자에게 보이지 않는 동안 불필요한 리소스를 해제하거나 cpu를 사용하는 작업을 종료해야한다.
여기서 액티비티가 다시 시작되면 onRestart 메서드가 호출되고, 액티비티가 실행을 종료하면 onDestroy 메서드를 호출한다.
- onDestroy
액티비티가 소멸되기 전 호출되는 메서드로, 시스템에서 사용자가 액티비티를 완전히 닫거나 finish()가 호출되는 경우 또는 기기회전이나 멀티 윈도우 모드로 인해 시스템이 일시적으로 액티비티를 소멸시키는 경우 onDestroy 메서드가 호출된다.
2. Activity 실행
안드로이드에서 액티비티를 실행하기 위해서는 인텐트가 필요한데, MainActivity의 경우는 별다른 설정 없이도 안드로이드에 자동으로 등록되고 실행된다.
하지만 새로 생성하는 액티비티의 경우 인텐트에 담아 시스템에 전달해줘야 사용할 수 있다.
Intent 객체는 앱 구성 요소로부터 작업을 요청하는 데 이용한다.
새로 생성된 액티비티를 실행하려면 다음과 같이 인텐트 객체를 사용하면 된다.
//MainActivity.kt
val secondIntent = Intent(this@MainActivity, SecondActivity::class.java)
startActivity(secondIntent)
수행할 컴포넌트의 이름을 직접적으로 명시해 인텐트 객체를 생성한다.
여기서는 SecondActivity를 실행시키기 위해 secondActivity코틀린 클래스가 변환된 java 클래스를 리플렉션을 사용해 지정한다.
startActivity 메서드에 인텐트 객체를 담아 호출하면 액티비티 매니저에 정보가 전달된다.
그러면 액티비티 매니저는 인텐트를 분석해 지정된 컴포넌트를 실행시킨다.
만약 여기서 전환된 액티비티가 종료되고 원래 액티비티로 돌아올 때 받을 결과 값이 있다면 startActivityForResult() 메서드를 호출하고, onActivityResult() 콜백에서 수신한 값을 받아 처리한다.
'Android > 개념' 카테고리의 다른 글
[Android] XML, JSON 데이터 가져오기 (0) | 2023.07.18 |
---|---|
[Android] RecyclerView와 ViewHolder (0) | 2023.06.30 |
[Android] Button과 뷰 이벤트 (0) | 2023.06.26 |
[Android] ImageView (0) | 2023.06.20 |
[Android] ScrollView (0) | 2023.06.15 |