출처 : Do it! 안드로이드 앱 프로그래밍 / 정재곤
Activity란?
액티비티란 사용자에게 UI가 있는 화면을 제공하는 앱 컴포넌트이다. 모바일 앱을 켰을 때 디스플레이에 보여지는 화면이라고 생각하면 된다. 앱은 보통 여러개의 액티비티로 이루어져 있고, 일반적으로 하나의 메인 액티비티를 갖고 있다. 일반적으로 앱을 처음 실행했을 때 보여지는 것이 메인 액티비티이다.
액티비티가 또 다른 액티비티를 실행하게 되면 이전의 액티비티는 정지되지만, '백스택'이라고 불리는 스택에 저장해두기 때문에 없어지지는 않는다. 액티비티의 상태가 변경되면 상황에 따라 네트워크나 데이터베이스 관련 객체와 같이 덩치가 큰 객체들은 해제하는 것이 좋다. 액티비티가 다시 화면에 보여질 때 필요한 리소스들을 다시 가져와서 중지되었던 작업들을 다시 실행할 수 있다.
Activity Life Cycle
액티비티는 처음 실행될 때 메모리에 만들어지는 과정부터 시작해서 실행과 중지, 그리고 메모리에서 해제되는 여러 과정의 상태 정보로 갖고 있으며, 이런 상태 정보는 시스템이 관리하면서 각각의 상태에 해당하는 메소드를 자동으로 호출하게 된다. 이러한 상태는 여러 가지가 있는데 대표적인 상태 정보는 다음과 같다.
- 실행(Running) : 화면상에 액티비티가 보이면서 실행되어 있는 상태
- 일시정지(Paused) : 사용자에게 보이지만 다른 액티비티가 위에 있어 포커스를 받지 못하는 상태. (예 : 대화상자)
- 중지(Stopped) : 다른 액티비티에 의해 완전히 가려져 보이지 않는 상태
이렇게 액티비티의 상태 정보가 변화하는 것을 액티비티의 수명주기 또는 생명주기라 하며 액티비티가 처음 만들어진 후 없어질 때까지 상태가 변화하면서 각각에 해당하는 메소드가 자동으로 호출된다. 이렇게 시스템에서 자동으로 호출하는 메소드를 '콜백 메소드'라고 한다.
1. onCreate()
- 액티비티가 처음 만들어졌을 때 호출된다.
- 화면에 보이는 뷰들의 일반적인 상태를 설정하는 부분이다.
- 이전 상태가 저장되어 있는 경우엔 번들 객체를 참조하여 이전 상태 복원이 가능하다.
2. onStart()
- 액티비티가 화면에 보이기 바로 전에 호출된다.
- 액티비티가 화면 상에 보이면 이 메소드 다음에 onResume() 메소드가 호출된다.
- 액티비티가 화면에서 가려지게 되면 이 메소드 다음에 onStop() 메소드가 호출된다.
3. onResume()
- 액티비티가 사용자와 상호작용하기 바로 전에 호출된다.
- onPause()에서 저장한 데이터를 다시 복원하는 기능을 한다.
4. onRestart()
- 액티비티가 중지된 이후에 호출되는 메소드로 다시 시작되기 바로 전에 호출된다.
- 이 메소드 다음에는 항상 onStart() 메소드가 호출된다.
5. onPause()
- 또 다른 액티비티를 시작하려고 할 때 호출된다.
- 저장되지 않은 데이터를 저장소에 저장하거나 애니메이션 중인 작업을 중지하는 등의 기능을 수행한다.
- 이 메소드가 리턴하기 전에는 다음 액티비티가 시작될 수 없으므로 매우 빨리 수행되어야 한다.
- 액티비티가 이 상태에 들어가면 시스템은 액티비티를 강제 종료할 수 있다.
6. onStop()
- 액티비티가 사용자에게 더 이상 보이지 않을 때 호출된다.
- 액티비티가 소멸되거나 또 다른 액티비티가 화면을 가릴 때 호출된다.
- 액티비티가 이 상태에 들어가면 시스템은 액티비티를 강제 종료할 수 있다.
7. onDestroy()
- 액티비티가 소멸되어 없어지기 전에 호출된다.
- 액티비티가 앱에 의해 종료되거나(finish() 메소드 호출) 시스템이 강제로 종료시키는 경우에 호출될 수 있다.
궁금했던 점
A 액티비티가 먼저 생기고 그 위에 B 액티비티가 생긴다면 콜백 메소드는 어떤 순서로 호출이 될까?
A onCreate() -> A onStart() -> A onResume()
-> B 액티비티 열기 -> A onPause()
-> B onCreate() -> B onStart() -> B onResume()
-> A onStop()
-> B 뒤로가기 (액티비티 스택에서 제거) -> B onPause()
-> A onRestart() -> A onStart() -> A onResume()
-> B onStop() -> B onDestroy()
결론 : 기존에 있던 액티비티의 onPause() 메소드가 호출되어 필요한 데이터를 저장하는 등의 로직이 실행되고 나중 액티비티가 생성된다. 나중 액티비티의 onResume() 메소드까지 호출된 후, 기존 액티비티의 onStop() 메소드가 호출되어 정지 상태가 된다.
'Android' 카테고리의 다른 글
[Android] 안드로이드 정리 (11) - 핸들러 (1) | 2020.03.13 |
---|---|
[Android] 안드로이드 정리 (10) - 프래그먼트 (Fragment) (0) | 2020.03.12 |
[Android] 안드로이드 정리 (8) - 플래그와 부가 데이터 사용하기 (0) | 2020.03.12 |
[Android] 안드로이드 정리 (7) - 인텐트(Intent) (0) | 2020.03.12 |
[Android] 안드로이드 정리 (6) - 여러 화면 만들고 화면 간 전환하기 (0) | 2020.03.12 |