슈퍼드로이드 카페의 안드로이드 강좌가 책으로 나왔습니다.
도서명 : 이것이 안드로이드다.
도서링크 : http://www.yes24.com//24/goods/13950202
================================================================================================
Activity 생명주기를 시작하기 앞서서 Activity를 관리하는 ActivityManagerService에 대한
이해가 많이도 아니고 쪼끄음만 있으면 도움이 된다.
몰라도 상관없으니 참조만 하자.
아래의 첨부파일이다.
ActivityManagerService에 대해서.ppt
1. Activity에 대해서
Activity란 Application을 구성하는 4대 요소중 하나라고 설명하였다.
Activity는 한 화면 그 자체이며, AndroidManifest.xml에 정의되어 사용된다.
아래는 AndroidManifest.xml에 한 화면을 사용하기 위하여
Activity를 추가한 내용이다. (eclipse를 이용하여 project를 생성하면 기본적으로 추가되어 있다.)
자세히 보면 <appliction> 항목의 하위 항목으로 등록된 것을 알 수 있다.
(이 것이 바로 appliction의 구성 요소 중 하나라는 것을 의미한다.)
위에서 AndroidManifest.xml에 등록된 Activity 구현을 ActivityLifeCycleTest.java라는
파일을 통해 해 주었다.
아래를 보면 AndroidManifest.xml을 통해
사용될 Activity를 선언 해 주었고,
그 구현은 AndroidManifest.xml에 정의한 Class 명(android:name="ActivityLifeCycleTest")으로
코드를 작성해 주어야 한다.
아래는 실행한 화면이다.
2. Activity 생명주기에 대해서
Activity는 ActivityManagerService를 통해 제어 된다. (해당 강좌에 포함된 ActivityManagerService 참조)
ActivityManagerService는 Activity를 실행하거나, 잠시 중단 시키거나, 종료할 수 있다.
하지만 만일 Activity가 실행중이던 상태에서 ActivityManagerService가 실행/중단/종료를 등을 한다면
실행중이었던 Activity는 어떤 문제가 발생될지 모른다.
예를 들어 특정 Activity에서 문서를 작성 중이라고 생각해 보자.
갑자기 ActivityManagerService가 해당 Activity를 종료해 버렸을 경우 작성 중이던 문서는 사라져 버릴 것이다.
그래서 아래와 같은 Framework 구조를 가진다.
위에 3번 과정에 ActivityManagerService를 통해 전달 받은 제어 명령을 수행하기 전에
Activity에서 미리 준비된 함수를 호출해 준다.
Activity는 미리 정의된 함수를 통해 제어에 대한 모든 준비를 할 수 있는 것이다.
종료의 경우 해당 Activity가 문서를 작성중이라면 미리 준비된 함수를 통해 문서를 저장하는 작업을 할 수 있는 것이다.
이렇게 미리 준비된 함수는 생명 주기를 가진다.
생명 주기는 아래와 같다.
| 생명 주기 관련 함수 | 호출 | 처리해 주어야 할 내용 |
| onCreate() |
최초 Activity가 생성될때 호출 |
대부분 Activity를 초기화하거나 UI 를 구성하는데 사용된다. |
| on Start() |
Activity의 내용이 화면에 출력되기 직전에 호출 |
많이 사용되지 않는다. |
| onRestart() |
최초 onCreate가 호출된 상태에서 생명 주기가 다시 시작 될때 onCreate 대신 호출 |
많이 사용되지 않는다. |
| onResume() |
Activity가 화면에 보여진 상태이나 사용자와 상호작용 전 상태이다. |
무조건 Activity가 실행 상태 전에 호출을 보장한다. 그러므로 어떤 동작을 재개할때 사용하는 경우가 많다. 예를 들어 음악이 중단되었다면 이 곳에서 다시 Play한다. |
| onPause() |
Activity가 종료/중단 등인 경우 무조건 호출을 보장 |
무조건 종료 시점의 호출을 보장함으로 종료처리 보장에 대해서는 안전한 함수이다. 대부분 Activity 종료시 저장해야 할 데이터를 처리하거나, 음악이 재생 중이라면 중단 처리등을 해야 하는 용도로 사용된다. |
| onStop() |
현재 Activity가 화면에 보이지 않는 상태가 되는 경우 호출 (다른 Activity 실행, Home으로 이동,등) |
종료시 무조건 호출되지 않을 수 있으므로 특정한 상황이 아니면 사용하지 않는다. |
| onDestroy() | Activity가 종료될때 호출 |
종료시 무조건 호출되지 않을 수 있으므로 특정한 상황이 아니면 사용하지 않는다. |
위에서 중요한 것은 노랑색으로 표시된 경우이다.
특히 onResume와 onPause는 생명 주기상 꼭 호출되는 것을 보장한다는 것이다.
그러므로 안정된 처리를 위해서는 위에 노랑색 부분의 처리를 고려하여야 한다.
나머지는 100% 호출을 보장하지 않으므로 사용을 권장하지 않는다고 말하고 싶다. ^^;
자 이제 눈으로 직접 상황별 생명 주기를 확인해 보자.
아래와 같이 패키지를 만들고 Activity의 생명 주기 함수를 Overriding하여
생명 주기별 로그를 찍도록 하자.
2.1 Activity의 실행 (Running)
아래와 같이 Activity가 최초 실행될때 호출됨을 볼 수 있다.
2.2 Activity의 종료 (Exit)
2.3 Activity의 중단(Stop)
2.4 Activity의 재 시작(Restart)
2.5 Activity의 잠시 중단(Pause)
2.6 Activity의 복귀(Resume)
2.7 Activity의 완전히 새로 시작
화면을 전체적으로 다시 그려야 하는 경우
화면에 영향을 주는 디바이스 정보 변경등...
(화면 가로 세로 변경, 언어 설정 변경...)
좀더 생각해 보자.
왜 디바이스 정보가 변경되면 Activity 생명 주기가 다시 시작할까?
이전에 "디바이스에 따른 리소스 참조 에 대해서" 배운 적이 있을 것이다.
기억이 안나면 위의 해당 링크를 클릭하라.
간단히 요약하자면 아래와 같다.
--------------------------------------------------------
① Localization 관련 ==> 예) values-en-rCA (영어-캐나다)
② 가로/세로 모드 관련 ==> 예) drawable-land
③ 화면 크기 관련 ==> 예) drawable-large
④ 화면 폭과 길이 관련 ==> 예) drawable-long
⑤ 밀도 관련 ==> 예) drawable-mdpi
⑥ 모바일 국가 코드와 모바일 네트워크 코드 관련 ==> 예) mcc000-mnc00 (mcc 숫자 세자리, mnc 숫자 두자리)
⑦ 터치 스크린 관련 ==> 예) drawable-stylus
⑧ 키보드 관련 ==> 예) drawable-keyshidden
⑨ UI 탐색 방법 관련 ==> 예) drawable-tracball
⑩ 키보드 입력 타입 관련 ==> 예) drawable-nokeys
--------------------------------------------------------
디바이스에 따른 리소스 참조 폴더가 달라진다는 것이다.
만일 Activity가 Running 상태에서
화면이 세로모드에서 가로모드로 디바이스 정보가 변경되었다고 생각해 보자.
현재 Activity에는 이미지 리소스를 하나 참조하고 있었고
그 폴더는 "drawable-port" 폴더를 참조했을 것이다.
하지만 가로 모드로 변경되면
"drawable-land" 폴더를 참조해야만 한다.
즉 그것을 화면에 적용하려면 리소스를 다시 읽어와야 함으로
Activity를 다시 시작할 수 밖에 없는 것이다.
2.8 Activity의 강제 종료
Activity가 강제 종료되는 경우에 대해서는 이전 강좌 OOM Killer에서 설명하였다.
즉 메모리가 부족한 경우 아래와 같이 강제 종료된다.
만일 종료된 Application을 사용자가 다시 시작하게 되면,
onCreate 부터 다시 시작하는 것이다.
본 강좌의 sample 소스는 아래를 참조하라.
!!! 위의 주제에 해당하는 적당한 예를 댓글로 남겨 주세요. ^^
활용 방안의 예는 다른 개발자들에게 많은 도움이 됩니다.
!!! 카페의 활성화를 위해 추천 버튼을 눌러 주세요.
댓글
댓글 리스트-
작성자jeongu park 작성시간 14.07.29 좋은 강의 잘 봤습니다 ㅎ 계속 공부할께여 ㅎ그리고 블로그에 퍼갈께요~
-
답댓글 작성자슈퍼성근 작성자 본인 여부 작성자 작성시간 14.07.29 출처만 밝혀 주신다면 얼마든지 상관없어요. 감사합니다.
-
작성자아름슈북안이 작성시간 14.09.28 잘보았습니다.
-
답댓글 작성자슈퍼성근 작성자 본인 여부 작성자 작성시간 14.09.29 감사합니다.
-
작성자droy 작성시간 15.06.02 nfc태그에 데이터 쓰는 거 하는 중인데 생명주기를 확실히 아는게 중요하네요 이걸 모르면 포그라운드디스패치를 이해하기 힘들어요. 태그에서 데이터를 읽어들일 때도 마찬가지고요 ㅎㅎ. 가장 머리아픈 부분이네요. 그래서 이렇게 정리된 자료가 필요합니다. 복잡할 땐 정리가 필요하니까요