-
[Android] Activity, 그리고 LifecycleAndroid 2021. 4. 6. 10:45반응형
액티비티(Activity)란?액티비티(Activity)는 화면 UI를 구성하는 요소로, 안드로이드 어플리케이션은 반드시 1개 이상의 액티비티를 갖고 있다.
어플리케이션에서는 두개 이상의 액티비티를 동시에 띄울 수 없고, 뷰나 프레그먼트를 이용한다면 화면을 분할할 수 있다.
액티비티 구현하기
안드로이드에서 액티비티는 Activity클래스 혹은 서브 클래스 상속받아 구현할 수 있다.
하위 버전과의 호환을 위해 Activity의 서브 클래스인 AppCompatActivity을 주로 사용한다.
public class SubActivity extends AppCompatActivity { //... }
그리고 액티비티를 포함한 컴포넌트들은 안드로이드 시스템(OS)이 확인할 수 있도록 manifest에 반드시 정의해야한다.
액티비티를 추가하기 위해서는 manifest의 <application> 태그 하위 요소로 <activity>요소를 추가하고, 구현한 액티비티 클래스를 지정한다.
<activity android:name=".SubActivity">
* 매니페스트에 추가하는 것을 까먹고 에러가 많이 나니 꼭꼭 확인하자.
액티비티의 생명주기(Lifecycle)
액티비티는 생성부터 소멸까지의 일정한 주기와 상태를 가지고 있으며, 상태가 변경될 때마다 생명주기 콜백 메서드들이 호출된다.
실행
액티비티가 실행되어 사용자와 상호작용하고 있는 상태.
화면 전체가 보이고, 포커스를 받고있다.
일시 정지
화면 전체 혹은 일부분이 보이나 포커스를 받지 못하는 상태.
주로 다이얼로그 등으로 화면이 일부분 가려지는 경우에 해당한다.
중지
액티비티가 완전히 보이지 않는 상태.
- 포그라운드 생애 : 사용자가 액티비티와 상호작용하고 있음
- 가시적 생애 : 화면 일부 또는 전체가 보임
- 전체 생애 : 액티비티 인스턴스가 메모리에 있음
생명주기 콜백 메서드
onCreate()
액티비티가 처음 생성될 때 호출.
화면에 보이는 뷰에 대한 상태를 설정한다.
예를 들어 setContentView() 메서드를 호출하여 레이아웃을 정의하거나, 번들 객체를 참조하여 이전 액티비티 상태를 복원한다.
(처음 생성된 액티비티의 경우 번들은 null이다. )
onStart()
액티비티가 사용자에게 보여지기 직전에 호출.
포그라운드로 나와 사용자와 상호작용하기 위한 최종 준비(?) 단계.
onResume()
사용자와 상호작용을 하기 직전에 호출.
onPause()
액티비티가 포커스를 잃고 일시중지 상태로 전환될 때 호출.
다음 액티비티를 실행하기 위해 onPause()의 실행시간은 굉장히 짧다. 따라서 큰 데이터를 저장하거나 네트워크 호출, 데이터 베이스 트랜잭션을 수행해서는 안된다.
onStop()
액티비티가 중지되어 사용자에게 더 이상 보이지 않을 때 호출.
저장되지 않은 데이터를 저장하거나, 애니메이션을 중지하는 등의 기능을 수행할 수 있다.
* 책에서는 onPause에서 해당 작업을 수행한다고 나와있는데, 안드로이드 개발자 가이드에서는 onStop에서 해야한다고 나와있다.
위에서 언급한 문제때문에 CPU 소모가 큰 작업은 onStop에서 해야한다는 의미에서 작성된 것 같다.onRestart()
중지되어있던 액티비티가 재시작할 때 호출.
중지되었던 시점부터 액티비티의 상태를 복원한다.
onDestroy()
액티비티가 소멸하기 직전에 호출.
액티비티의 마지막 콜백 메서드로써 액티비티의 리소스를 해제하도록 구현한다.
UI 상태 저장 및 복원
화면 회전 및 분할 화면을 할 경우 액티비티는 소멸하고 새로 생성하기 때문에 UI에 존재하는 데이터는 사라지게 된다. 또는 잠시 일시정지 상태에서도 안드로이드 시스템은 메모리가 부족할 경우 일시 정지에 있는 프로세스를 소멸시킬 수 있기 때문에 데이터 분실의 위험이 있다.
따라서 onSaveInstanceState() 혹은 AAC의 ViewModel을 이용해 앱의 UI 상태를 저장할 수 있다.
* 자세한 내용은 [ UI 상태 저장, SIS vs ViewModel ] 이라는 게시물을 따로 업로드할 예정!
'Android' 카테고리의 다른 글
[Android] 브로드캐스트 리시버(Broadcast Receiver)와 전송 (0) 2021.04.08 [Android] SharedPreferences (0) 2021.04.06 [Android] 태스크(Task)의 개념과 launchMode로 설정하기 (0) 2021.04.06 Android Developers - 안드로이드 공식 사이트 파헤치기 (0) 2021.02.07 [Android] 안드로이드 면접 질문 정리 (1) 2020.11.10