2. Activity란..
• 가장 쉬운 이해는 "화면" 하나이다.
o 사실은 Activity가 화면을 가질 수 있는 것이며, Activity는 화면 구성 외
에 사용자 입력과 Event들을 접목 시키는 controller 역할을 많이 한다.
o 화면을 가지지 않는 Activity는 어찌 보면 Service라고 볼 수도 있지만, 의외로 화면 밝기 조
정을 위한 Activity와 같이 화면을 가지지 않는 Activity들이 있습니다. 또는 다운로드를 잠시
하면서 화면을 얼려두고 싶은 경우와 같은 경우가 있을 수 있습니다. 이와 같은 추가적인 사
용 예는 구글에서 "android activity no UI"로 검색하면 찾으실 수 있습니다.
• 프로그램은 한 화면에서 모든 동작이 수행이 힘들기 때문에 여러 Activity로
구성이 되고 이들 간에는 서로 통신을 해야 합니다.
• Activity들은 자체적인 Lifecycle을 가지고 있으며, 각 단계에 대한 callback을
지정해서 원하는 동작을 취하게 할 수 있습니다.
3. Activity 생명 주기 생명 주기에 대한 정확한 이해가 필수!
대부분 개발과정에서 미세한 버그들은 이러
한 생명 주기에 대한 고려가 없는 경우가 대
부분입니다.
게다가 생명 주기는 프로그래머가 강제할 수
는 없습니다. 단지 요청을 할 뿐. 실제 모든
생명 주기 관할은 Android OS 수준에서 일
어납니다(수행이 됩니다.).
이는 다시 이야기 하면, 프로그래머가 원하
지 않는 시점에도 생명이 마쳐질 수 있는 상
황이 있다는 사실 입니다.
대표적인 경우가 메모리가 부족한 경우입니
다.
위 생명 주기를 자세히 보기 전에
Activity 상태에 대해서 먼저 살펴 봅니다.
4. Activity 상태
• 실행 (active, running)
o 사용자가 현재 사용 중인 상태. 스택의 제일 위에 있으며, 화면 상에서
도 제일 위에 있다. 입력 포커스를 가지며, 사용자 입력을 처리를 담당
합니다.
• 일시정지 (pause)
o 포커스는 잃었지만 사용자에게는 보이는 상태. 위쪽에 다른 Activity가
있지만 화면 전체를 가리지는 않고 반투명 상태가 이에 해당. 살아는 있
지만, 경우에 따라서 시스템에 강제 종료 가능 상태.
• 정지 (stopped)
o 다른 Activity에 의해서 완전히 가려진 상태, 사용자 눈에 보이지 않습니
다. 그러나 메모리 상에 기존 상태를 유지하고 있어서, 필요에 따라서
다시 활성화 되어 화면에 나타날 수 있습니다. 물론 이 상태도 시스템에
의해서 강제 종료 가능합니다.
5. 처음 생성이 될 때. (생성 의미는 메모리에~)
다른 Activity가 현재 Activity위에 잠시 떳다
가 사라져서 원래 Activity가 보이는 경우에
도 onResume
다시 화면에 올라오는 경우는 대부분 여기서
처리를 하는 것이 대부분.
onStart 보다는 onResume을 많이 활용.
onCreate
onResume
onPause
습관적으로 고민을 해야 하는 callback
killable status
6. onPause
onPause가 호출되면서 부터 Paused 상태가 된다는 것은.
Killable status로 진입이 된다는 이야기입니다.
이 시점 이후로는 시스템이 언제나 필요에 따라서 해당 Activity를
별도 신호 없이 메모리에서 소멸 시켜 버릴 수 있다는 이야기 입니
다.
여기서 별도 신호가 없다는 이야기는 onStop, onDestroy가 호출
이 되지 않는다는 이야기가 됩니다.
즉 onPause는 생명주기의 마지막 보장된 정리 타임이라고 할 수
있습니다. 그렇기에 우리는 이 부분에서 해당 Activity에 대한 정리
를 열심히 해야 합니다.
7. onPause에 대해서 예제를 통한 추가 조사.
A B
C
B.finish()
A.finish()
App 실행
startActivity(B)
startActivity(C)
C.finish()
각 단계에 대해서 lifecycle callback 로그 남김
아래 순서에 따라서 동작을 수행하고 로그를 추적
1. App 실행
2. startActivity(B)
3. B.finish()
4. startActivity(C)
5. C.finish()
6. A.finish()
여기서 B는 일반 Activity. C는 배경이 투명인
Activity
* 배경 투명 Activity는 android:theme="@android:style/Theme.Translucent.NoTitleBar" 설정 통해서 간단 지정 가능
8. onPause 실험 결과
1. App 실행
a. A onStart
b. A onResume
2. startActivity(B)
a. A onPause
b. B onStart
c. B onResume
d. A onStop
3. B.finish()
a. B onPause
b. A onRestart
c. A onStart
d. A onResume
e. B onStop
f. B onDestroy
4. startActivity(C)
a. A onPause
b. C onStart
c. C onResume
5. C.finish()
a. C onPause
b. A onResume
c. C onStop
d. C onDestroy
6. A.finish()
a. A onPause
b. A onStop
c. A onDestroy
9. onPause 에 대한 에매한 부분에 대한 정의
• onPause는 Activity가 stopped 상태로 전환하기 전에 무조건 호
출이 된다.
• Activity가 배경이 투명한 Activity가 뜨는 경우에는 기존 Activity
는 onPause 상태가 유지가 됩니다.
o 여기서 배경이 투명한 Activity라고 함은 Dialog는 절대 아님
을 명심합니다.
o 투명한 Activity 때문에 onPause에서 onStop으로 이동하지
않고, onStop에 머물러 있는 상태가 유지 됩니다.
• onPause 구현은 가능한 빠르게 실행되도록 합니다. 새로 올라오
는 화면의 onStart/onResume이 전 화면의 onPause가 마쳐져야
시작되기 때문입니다.
11. 이건 한 번 해보고 가자
1. Activity 하나에 각종 callback들을 재정의하고 Log를 남
겨서 실제 언제 callback이 수행이 되는 가를 확인하자.
2. Activity를 두개를 만들어서
a. 첫 번째 Activity에서 버튼 클릭해서 두번째 Activity를
생성을 하자.
b. 두 번째 Activity에서 닫기 버튼을 만들어서 다시 원래
Activity로 돌아오자.
c. 두 Activity 모두에 callback들을 정의해서, 언제 호출
이 일어나는 가를 확인하자.