안드로이드 Activity 생명주기
1. Activity : 안드로이드 Application 의 기본 단위로, 사용자 인터페이스를 화면에 표시하고 사용자의 입력을받아서 처리하는 역할을 함
2. 생명 주기 (Life cycle) : Activity 는 시작, 실행, 활성, 비활성화, 정지, 종료되는 일련의 상태를 순환
3. system 은 task의 실행중인 Activity들을 stack으로 관리함
activity 가 새로 생성되면 stack의 제일 위에 놓여 활성화 됨
이 상태에서 다른 activity 가 또 생성되면, 기존의 activity는 잠시 가려지고 새 activity가 stack의 제일 위에 배치됨
stack 제일 위의 activity 가 종료되면 바로 아래쪽에 잇는 activity 가 자연스럽게 활성화 될 것임
stack 의 activity 는 넣고 빼기만 할 뿐 순서가 바뀌지 않음
4. stack activity 의 세가지 상태
- 실행 (active, running)
: 사용자가 직접 사용하는 상태. 스택의 제일 위에 있으며 화면상에서도 제일 위에 있음.
입력 포커스를 가지며, 사용자의 입력을 직접 처리함
- 일시 정지 (pause)
: 포커스는 잃었지만 사용자에게는 보이는 상태
위쪽에 다른 activity 가 있지만, 화면 전체를 다 가리지 않았거나 반투명한 경우가 이에 해당됨.
살아있는 상태와 같지만 시스템에 의해 강제 종료될 수도 있음
- 정지 (stoped)
: 다른 activity 에 의해 완전해 가려진 상태이며, 사용자 눈에 보이지 않음
그러나 모든 정보를 다 유지하고 있으므로 언제든 다시 활성화 될 수 있음
system 은 메모리가 부족하면 정지 상태의 activity를 언제든지 강제 종료할 수 있음
5. Activity 의 전체 생명주기
- onCreate()
: activity 를 초기화 함
중지했다 재시작 하는 경우라면 activity 의 이전 상태 정보인 bundle 이 전달됨. 이정보대로 재초기화 함
- onRestart()
: 재시작될 때 호출 됨.
가시 수명으로 이어지기전 acvitity 처리를 위해 호출. 항상 onStart() 호출 직전에 호출됨
- onStart()
: 액티비티가 사용자에게 보이기 직전에 호출.
- onResume()
: 사용자와 상효작용을 하기 직전에 호출됨. 이 단계에서 스택의 제일 위로 올라옴
activity 스택의 맨 위에 있어서 activity 가 사용자에게 보여지고, 사용자의 입력을 처리할 수 있을 때 호출
_ onPause()
: 다른 activity 가 실행될 때 호출됨.
이 단계에서 미저장한 데이터가 있으면 저장하고, 애니메이션은 중지해야 함
이 메서드가 리턴되어야 새 activity 가 활성화 되므로 시간을 너무 많이 끌어서는 안됨
즉, 활성 수명 끝에서 호출 되는데, 포커스를 잃고 이전의 activity 가 resume 되기 전에 호출됨.
onPause() 에서는 데이터의 저장, 애니메이션의 중지, cpu 를 소비하는 작업 중단과 같은 일들을 수행해야함
사용자가 activity 를 떠날 때 다루어야 할 매서드임
application 실행 도중 전화가 걸려오면 그때까지의 내용을 모두 저장해야 하는데, onPause() 에서 이러한 저장과정이 진행됨
- onStop()
: 더이상activity 가 스택의 최상위에 있지않으므로 사용자에게 보이지 않게 될 때 호출됨
- onDestory()
: activity 가 파괴될 때 호출됨
system 에 의해 강제로 종료되는 것인지 아니면 finish 메서드 호출에 의해 스스로 종료하는 것인지는 infinish 메서드로 조사 가능
onDestory() 메서드가 호출되면 system 에서 activity 가 존재하지 않음
출처 : http://apponline.tistory.com/entry/%EC%95%88%EB%93%9C%EB%A1%9C%EC%9D%B4%EB%93%9CAndroid-%EC%95%88%EB%93%9C%EB%A1%9C%EC%9D%B4%EB%93%9C-Activity-%EC%83%9D%EB%AA%85%EC%A3%BC%EA%B8%B0
- 액티비티는 효율적인 메모리 관리를 위해 생성, 소멸되는 조건인 생명주기를(Lifecycle) 가지고 있다
- 생명주기는 7가지 단계로 구분되며 다음 순서를 기본으로 진행된다
onCreate(), onStart(), onResume(), onPause(), onStop(), onRestart() 또는 onDestroy()
- 각 상태에 따라 필요한 작업을 메소드를 오버라이드 하여 처리해주면 된다
- 여러개의 액티비티를 이용중 시스템의 리소스가 부족하면 다음상태의 액티비티를 강제로 종료시킨다
onDestroy() - 1순위, onStop() - 2순위, onPause() - 3순위
- onPause() 상태의 Callback은(실행완료) 보장하지만, onStop()과 onDestroy()는 보장할 수 없다
(미완료 상태에서 System이 강제종료 시킬 수 있으므로 되도록 onPause()에서 종료를 대비 해야한다)
- 강제종료된 Activity는 리소스가 확보되면 다시 복구 시킨다
- 강제종료시에는 데이터 복원를 대비하여 onPause() 실행 전 onSaveInstanceState(Bundle b) 를 실행시킨다
- 강제종료시에는 onStart() 호출 후 실행되는 onRestoreInstanceState(Bundle b) 또는
onCreate(Bundle b) 를 사용하여 복원작업을 수행할 수 있다
- 화면의 Orientation(가로/세로) 변경시 onDestroy()를 호출 후 onCreate()가 실행된다
액티비티가 처음 생성될때와(화면이 회전되어 orientation이 변경될때도 기본으로 실행) 실행되며
레이아웃배치와 변수선언 등 각종 초기화 작업을 구현하는 단계이다
완료 후 onStart()를 호출한다
- onStart()
onCreate() 이후 또는 onRestart()로 다시 시작된 후 처음으로 호출하는 단계이며
화면생성이 완료되고 사용자 입력을 받기 바로 직전의 단계이다
완료 후 onResume()를 호출한다
- onResume()
onResume() 이 실행되면 상호작용이 가능하며 모든준비가 완료되고 액티비티가 완벽하게 활성 상태가 된다.
onPause()에서 다시 시작되었을때 호출하는 단계이기도 하다
- onPause()
상태에서 다른 Activity에 포커스를 넘겨준 후 비활성화(background) 되며 상호작용이 중단된 단계이다
이 상태 이후부터는 언제든지 시스템의 강제종료가 가능하며 이 상태가 완료 되어야 다음 Activity가
활성화(foreground) 되고 이후 이 액티비티는 onStop() 상태가 된다
단, 다음 Activity 의 테마가 translucent 인 투명한 배경의 Activity 와 같이 풀스크린이 아닌
Activity일 경우에는 onStop() 상태가 되지 않고 onPause()를 유지한다
하나 더 덧붙이면, 투명배경의 Activity와 비슷한 Diaglog 의 경우에는 onPause()가 적용되지 않는다
- onStop()
Activity가 사용자에게 보이지 않는 비활성화 상태로 돌아서게 되면 호출하는 단계이다
=> 다른 activity 를 활성화 시켰을때는 background로 onStop() 상태가 유지되며,
=> 현 액티비티에서 finish()를 호출하거나 back key를 이용해 home activity로 돌아갈때는
onStop() 후 onDestroy()를 호출하고
=> 다음 Activity에서 back 하여 현 액티비티로 돌아올때는 onRestart(), onStart(), onResume 순으로 호출한다
- onDestroy()
finish(), finishActivity() 같은 정상적인 종료시에 호출되며, onCreate()에서 호출한 자원의 반납등을 하는 단계이다
- onRestart()
onStop()인 비활성화 상태에서 다시 활성화되는 단계에서 발생한다
'개발지식창고 > Android_Java' 카테고리의 다른 글
Activity 에서 AppCompatActivity 로 전환 (0) | 2016.02.12 |
---|---|
Android Studio 에 SVN 연동하기 (0) | 2016.01.28 |
[Custom UI] InfiniteScrollListView 활용법 (0) | 2015.10.12 |
주소록 시도, 구군 2단계 (0) | 2015.08.27 |
안드로이드 우편번호 Daum API 적용 예제 (0) | 2015.08.27 |