1. 액티비티 시작
- main()으로 시작되는 일반적 언어와 달리 안드로이드는 특별한 콜백 메소드를 호출함으로써 액티비티를 실행
- 안드로이드는 아래 그림과 같이 피라미드 형태의 일련의 life cycle 메소드를 콜. 새 액티비티가 생성되면 한단계씩 위의 메소드를 콜한다. 즉, 현재 foreground에 있는 액티비티가 아래 그림에서 가장 탑에 위치한다. (Resumed 상태)
액티비티가 사라질때는 반대로 내려감. 특정 지점에서 멈춘 후 다시 올라갈 수도 있음
- 실제 액티비티는 오로지 세가지 상태로만 존재 (아래의 나머지 상태는 모두 거쳐간다는 의미)
1) Resumed : foreground에 있음
2) Paused : 다른 액티비티에 의해 뒤에 숨어있음. foreground에 있는 액티비티는 반투명 상태이거나 전체화면이 아닌 상태.
3) Stopped : 완전히 백그라운드에 있음. 멤버 변수는 모두 보존됨.
- 앱 실행 시 최초로 onCreate를 호출할 액티비티는 AndroidManifest.xml 파일에서 선언. MAIN 액션과 LAUNCHER 카테고리를 포함하는 <intent-filter>에 선언
<activity android:name=".MainActivity" android:label="@string/app_name"> <intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter></activity> - onCreate 실행 후 바로 onStart, onResume이 실행됨. 실제로 화면에 앱이 뜨는것은 onStart를 콜했을때이나, 바로 onResume 메소드가 콜되면서 resumed 상태로 넘어감
- onDestroy 메소드가 마지막으로 실행되나, 그 전에 onPause, onStop이 순서대로 실행됨. 여기서 대부분의 앱 리소스를 정리
단,
1) onCreate에서 백그라운드로 쓰레드를 돌린 경우/메모리 누수 발생 가능한 long-running 리소스가 있으면 onDestroy 에서 해결
2) 다른 앱을 띄우는 임시 앱 등 onCreate에서 finish()를 콜하여 앱을 끝내는 경우 onPause, onStop 없이 바로 onDestroy가 실행
2. Pause
- Resumed 상태에서 paused 상태로 넘어가면 onPause() 메소드가 호출되고, 반대인 경우 onResume() 메소드를 호출. Paused 상태의 원리 의미는 잠시 멈춤 상태이지만, 보통 곧 액티비티를 떠나고 stopped 상태로 들어갈 것임을 의미
- onPause()에서 주로 하는일
1) CPU 잡아먹는 애니메이션 등의 동작 stop
2) 저장되지 않은 변화를 저장 (commit)
3) 센서 핸들, broadcast receiver 등 시스템 자원 반납
- 그렇다고 onPause 에서 무조건 변화를 저장해선 안됨. auto-save가 활성화 되었을때만. 그리고 onPause에서 DB의 사용은 다음 액티비티로 전환하는 속도를 떨어뜨림
3. Resume
- Paused 상태에서 액티비티를 재활성화하면 onResume() 메소드가 호출
- onResume()은 pause 상태에서 resume 상태로 넘어갈 때 뿐 아니라 최초 액티비티 기동시에도 호출된다는것을 명심
4. Stop
- 액티비티가 stopped 상태라도 액티비티 인스턴스는 메모리에 남아있음. 따라서 onStop 메소드는 구현하지 않을때가 많음
- 그러나, 시스템이 메모리 회복을 위해 onDestroy() 콜 없이 강제로 인스턴스를 제거할 수 있으므로 leak 방지를 위해 release를 철저히 해주어야 함
- 시스템은 레이아웃에 있는 각 뷰의 현재 상태를 저장하고 있으므로 onStop 안에서 해당값을 저장할 필요는 없음
4. Restart/Start
- 액티비티가 foreground로 오면 onRestart()/onStart() 메소드가 차례대로 호출됨
- stopped 상태에서도 대부분의 상태가 그대로 남아있으므로 onRestart가 할 일은 딱히 없음
- 오히려 onStop의 카운터 파트는 자원을 초기화하는 의미에서는 onStart 가 맞다
5. Recreating
- back 버튼을 누르거나 finish()를 콜함으로써 종료된 경우는 정상종료라고 판단하여 시스템이 별다른 조치를 취하지 않음
- stopped 상태의 액티비티를 시스템이 강제 종료한 경우, 이전 상태-instance state-를 key-value의 collection으로 Bundle 오브젝트에 저장함
-
화면이 회전하면 항상 destroy 되었다가 recreate 됨 - View 오브젝트는 자동으로 저장되지만(기준은 android:id로 unique한 id를 갖는 뷰), 기타 변수 등은 Bundle 오브젝트에 key-value 쌍으로 저장해야 함
- onSaveInstanceStat()/onRestoreInstanceState() 메소드를 오버라이드
- 액티비티가 recreate 인지 최초 create인지를 확인하려면 onCreate() 안에서 반드시
Bundle이 null 인지를 판단해야함. 최초라면 null이다.
- 또는, onStart()에서 불려지는 onRestoreInstanceState()를 오버라이드 해도 됨. 이 메소드는 Bundle이 null 이 아닐때만 실행되므로 Bundle 오브젝트를 확인할 필요는 없음
* 출처 :
http://developer.android.com/training/basics/activity-lifecycle/index.html
## Google Android Site ## - http://developer.android.com/reference/android/app/Activity.html