일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- 티스토리
- 서브모듈 pull
- firebase
- 쿼터뷰
- java
- 유니티
- Unity
- 목서버
- 앱
- 카페오냥
- 서브모듈 sourcetree
- gitlab submodule
- 게임개발
- 안드로이드
- submodule sourcetree
- 2d게임
- 안드로이드개발
- DataBinding
- 앱개발
- GIT
- github
- github submodule
- 안드로이이드 submodule
- 개발
- Kotlin
- 코틀린
- Android
- Android Studio
- 타이쿤
- 내 맘대로 정리한 안드로이드
- Today
- Total
Uing? Uing!!
[내 맘대로 정리한 안드로이드] 액티비티 생명주기 (Activity Lifecycle) 본문
생명주기(Lifecycle)를 알아야 하는 이유
액티비티 생명주기란 액티비티가 생성되고, 정지되고, 재생되고, 종료되는 등의 상태 변화와 그에 따른 콜백 메서드를 총칭한다.
안드로이드 개발자라면 액티비티의 생명주기를 꼭 알아야 한다는데, 왜 그럴까?
안드로이드를 처음 공부하면, Activity를 생성하고 layout과 연결하는 작업부터 시작하기 마련이다.
화면 단위에 해당하는 Activity들은 생성되고, 파괴되고, 다른 Activity에 가려지기도 한다.
간단한 화면 하나를 구현하는 작업이라면 이러한 Activity의 생명주기에 대해서 자세히 알지 못해도 별다른 문제가 없다.
하지만 백그라운드에서 어떤 다운로드 작업이 진행되고 있다고 생각해 보자.
다운로드 도중에 Activity가 갑자기 종료된다면?
이 작업은 화면과 관련 없이 돌아가고 있기 때문에 종료되지 않는다.
더이상 필요하지도 않을 자료들을 계속 다운받고 있는 것이다.
Activity의 생명주기를 알고 있다면, onDestroy() 콜백에서 이런 문제를 방지할 수 있음을 떠올릴 수 있다.
이처럼 안드로이드 생명주기를 잘 알고 활용하면, 액티비티 상태의 변화에 따라 발생하는 갑작스러운 문제를 사전에 방지할 수 있다.
대표적으로는, 아래와 같은 문제들을 방지할 수 있다. (공식 문서 참조)
- 사용자가 앱을 사용하는 도중에 전화가 걸려오거나 다른 앱으로 전환할 때 비정상 종료되는 문제
- 사용자가 앱을 활발하게 사용하지 않는 경우 귀중한 시스템 리소스가 소비되는 문제
- 사용자가 앱에서 나갔다가 나중에 돌아왔을 때 사용자의 진행 상태가 저장되지 않는 문제
- 화면이 가로 방향과 세로 방향 간에 회전할 경우, 비정상 종료되거나 사용자의 진행 상태가 저장되지 않는 문제
액티비티 생명주기 (Activity LifeCycle)
아래 그림은 안드로이드 공식 문서에 첨부되어 있는 Activity Lifecycle에 대한 도식이다.
onCreate(), onStart(), onResume(), onPause(), onStop(), onDestroy()의 주요 콜백이 나타나 있다.
Activity Launched부터 Activity shut down까지의 각 과정에 대해 정리해 보면 이렇다.
Activity launched : 액티비티가 실행되었다. 실행 후 액티비티는 '생성됨(CREATED)' 상태가 된다.
onCreate() : 액티비티를 생성한다. 실행 후 액티비티는 '시작됨(STARTED)' 상태가 된다. (필수 구현 콜백이다.)
onStart() : 화면이 사용자에게 표시된다. 실행 후 액티비티는 '재개됨(RESUMED)' 상태가 된다.
onResume() : 사용자와 상호작용할 수 있는 상태가 된다.
Activity running : 실제로 액티비티와 상호작용이 가능한 환경에 있다.
onPause() : 액티비티가 foreground에 있지 않으면 호출된다. 실행 후 액티비티는 '일시중지됨(PAUSED)' 상태가 된다.
onStop() : 액티비티가 완전히 화면을 벗어나면 호출된다. 실행 후 액티비티는 '중지됨(STOPPED)' 상태가 된다.
onDestroy() : 액티비티가 소멸되기 전(종료 또는 화면 회전) 호출된다.
Activity shut down : 액티비티가 종료되었다.
실제 상호작용 방식에 따라 몇 가지 상황을 들자면 이렇다.
우선 액티비티가 실행되면, onCreate() -> onStart() -> onResume() 순서로 액티비티를 활성화하게 된다.
이후 다른 화면에 의해 화면의 일부가 가려지면 onPause()가 실행되고, 전체가 가려지면 onStop()이 실행된다.
PAUSED 상태에서 사용자가 다시 화면으로 돌아오면 onResume() 로 액티비티가 활성화된다.
STOPPED 상태에서 사용자가 화면으로 돌아오면 onRestart() -> Start() -> onResume() 로 액티비티가 활성화된다.
사용자가 화면을 회전하거나 종료한다면 onPuse() -> onStop() -> onDestroy() 하여 액티비티가 소멸된다.
생명주기를 활용하여 에러 방지하기
앞에서 생명주기로 어떤 문제들을 방지할 수 있는지에 대해 언급했었다.
- 사용자가 앱을 사용하는 도중에 전화가 걸려오거나 다른 앱으로 전환할 때 비정상 종료되는 문제
- 사용자가 앱을 활발하게 사용하지 않는 경우 귀중한 시스템 리소스가 소비되는 문제
- 사용자가 앱에서 나갔다가 나중에 돌아왔을 때 사용자의 진행 상태가 저장되지 않는 문제
- 화면이 가로 방향과 세로 방향 간에 회전할 경우, 비정상 종료되거나 사용자의 진행 상태가 저장되지 않는 문제
그렇다면 생명주기를 활용해서 이런 문제들을 어떻게 방지할 수 있을까?
이에 대한 개인적인 의견들을 아래에 간략히 기술하지만, 자세한 구현 방법이나 예시에 대해서는 다루지 않는다.
1) 사용자가 앱을 사용하는 도중에 전화가 걸려오거나 다른 앱으로 전환할 때 비정상 종료되는 문제
활동이 전화나 다른 앱으로 가려질 때에는 onStop()이, 재개될 때에는 onResume()이 실행된다.
따라서, 이 두 콜백 메서드를 잘 활용해 종료를 방지할 수 있다.
2) 사용자가 앱을 활발하게 사용하지 않는 경우 귀중한 시스템 리소스가 소비되는 문제
처음에 이야기했던 '액티비티를 떠났는데 백그라운드 작업이 종료되지 않는 경우' 등이 여기에 해당할 수 있다.
이런 상황을 방지하기 위해서 기본적인 안드로이드의 onDestroy() 또는 onStop() 메서드를 활용할 수 있다.
onDestroy() 또는 onStop()에서 문제가 되는 작업을 종료시키면, 액티비티가 종료되거나 잠시 떠나 있을 때 해당 작업도 자동으로 중지된다.
3) 사용자가 앱에서 나갔다가 나중에 돌아왔을 때 사용자의 진행 상태가 저장되지 않는 문제
상태를 임시 저장해야 할 경우에는, onStop() 이후에 onSavedInstanceState()라는 메서드가 자동으로 실행된다. (안드로이드 P 이후 기준)
또한 활동을 복구해야 할 때에는, onRestoreInstanceState() 메서드가 자동으로 실행된다.
따라서 이 문제는 onSavedInstanceState()와 onRestoreInstanceState()라는 수명 주기 콜백을 활용해 방지할 수 있다.
4) 화면이 가로 방향과 세로 방향 간에 회전할 경우, 비정상 종료되거나 사용자의 진행 상태가 저장되지 않는 문제
이 문제 역시 3)의 onSavedInstanceState()로 어느 정도는 해결할 수 있을 것이다.
다만, 회전의 경우에는 configChanges를 이용해 처음부터 다시 시작되지 않게 사전에 처리할 수 있다.
이 부분에 대해서는 이후 아래 포스팅을 통해 따로 작성하였다.
'Android' 카테고리의 다른 글
[내 맘대로 정리한 안드로이드] 스플래시(Splash) 화면은 어떻게 만들어야 효율적으로 활용할 수 있을까? (4) | 2020.08.03 |
---|---|
[안드로이드 팁] configChanges : 화면이 회전해도 상태는 유지하고 싶어요! (0) | 2020.08.01 |
[내 맘대로 정리한 안드로이드] 왜 UI Thread에서는 긴 작업을 하면 안 되는 걸까? (0) | 2020.07.30 |
[내 맘대로 정리한 안드로이드] Java와 Kotlin에서의 접근 제한자 (0) | 2020.07.29 |
[안드로이드 삽질기록] 구글 로그인 결과가 Status{statusCode=DEVELOPER_ERROR, resolution=null}일 때 (0) | 2020.07.29 |