목차
1. Activity 클래스
2. The Task Backstack
A. Process vs. Task
B. Example
3. The Activity Lifecycle
Lifecycle State
onCreate()
onRestart()
onStart()
onResume()
onPause()
onStop()
onDestroy()
4. Starting activities
5. Handling configuration changes
6. 시리즈 연재
1. Activity 클래스
사용자와의 상호작용을 위한 UI 인터페이스를 제공해주는 클래스이다. 특정 앱을 실행시켰을 때 보게 되는 하나의 화면이 Activity 하나라고 생각하면 이해하기가 편하다. 다르게 이야기 하면 하나의 Activity는 하나의 역할에 집중하도록 구현되어야 한다. 가령, 로그인을 하는 화면, 이메일 리스트를 확인하는 화면, 이메일 내용을 확인하는 화면들은 각각 하나의 Activity 클래스로 만들어지게 된다. 추가적인 내용은 안드로이드 공식문서인 여기를 참조하자.
2. The Task Backstack
A. Process vs. Task
우선 process와 task의 용어를 정리할 필요가 있다. 보통은 비슷하게 사용되는 두 단어가 안드로이드 플랫폼에서는 다르게 사용되고 있기 때문에 둘을 구분할 필요가 있다.
우선 Process는 아래와 같은 특징을 가진다. 참고로 말해 이 용어는 우리가 일반적으로 생각하고 있는 그 용어다.
하나의 실행 파일로 부터 만들어진 런타임 인스턴스
하나의 패키지는 하나의 프로세스가 된다. (ex : 16871 kB: com.kakao.talk (pid 2425))
프로세스가 필요 없어지면 안드로이드 플랫폼에 의해서 kill 된다.
다음은 Task이다.
여러 개의 관련된 Activity 들의 집합이다.
소속된 Activity는 서로 다른 패키지에 존재할 수 있다. (예: 카톡 → 전화 → 주소록)
하나의 task 내에는 여러 프로세스가 소속되어 있을 수 있다. (위의 이유로)
대부분의 Task는 홈 스크린에서 시작한다.
안드로이드는 Task 마다 BackStack마련해서 Activity를 관리한다.
Task는 유저 입장에서의 의미가 강하고 Process는 개발자 입장이 강한 표현이다.
B. Example
아래는 하나의 BackStack에서의 Activity 관리에 대한 예제이다.
Activity1이 Foreground로 수행 중
Activity2가 Foreground로 수행되고 Activity1은 BackStack의 Top으로 내려감
Activity3이 Foreground로 수행되고 Activity2은 BackStack의 Top으로 내려감
Back 버튼에 의해서 Activity3이 종료되고 Activity2가 Foreground가 됨
앞에서 이야기 했지만 안드로이드에서는 각 Task 마다 BackStack을 관리하고 있다. 만약 유저가 Task A를 진행 중에 Home 키를 눌러서 홈으로 이동 후 다른 앱을 런칭 시키면 이전에 진행하던 Task A는 Background Task가 되고 새로운 Foreground Task B가 생성되게 된다.
유저가 Task B를 종료하고 나서 Task A에 해당하는 앱을 런칭하게 되면 이전에 사용중이던 BackStack의 상태를 그대로 이용하게 된다. 하지만 만약 메모리가 부족해서 Task A의 프로세스가 종료된 상태라면 다시 처음부터 진입하게 된다.
3. The Activity Lifecycle
Activity는 안드로이드 앱이 수행될 때, 생성/멈춤/시작/종료 등의 상태전의를 거치게 된다. 보통은 유저와의 상호작용에 의해서 상태전의가 이뤄지지만 일부 상황에서는 안드로이드 플랫폼에 의해서 상태전의가 발생하기도 한다. (메모리 부족에 의한 강제 종료)
Lifecycle State
실행 (Resumed/Running) : 화면 상에 Activity가 보이면서 실행되어 있는 상태
일시중지 (Paused) : 화면 상에 보이지만 포커스를 잃은 상태
중지 (Stopped) : 화면에 보이지 않는 상태
안드로이드 플랫폼은 생애 주기가 변할 때마다 Activity의 특정 메소드들을 호출해준다.
protected void onCreate(Bundle savedInstanceState)
protected void onStart()
protected void onResume()
protected void onPause()
protected void onRestart()
protected void onStop()
protected void onDestroy()
참조 : http://developer.android.com/training/basics/activity-lifecycle/starting.html
onCreate()
Activity가 메모리에 로드될 때 호출되는 메소드이다. 아래와 같은 기본적인 시퀀스를 가진다.
super.onCreate() : 부모클래스의 초기화 수행하는 부분
setContentView() : 레이아웃 인플레이션을 수행해주는 부분 ⇒ UI 레이아웃 설정 부분
findViewById() : UI View 들에 대한 참조를 얻는 부분
setOnXXX() : UI View에 이벤트 핸들러를 삽입하는 부분
onRestart()
Activity가 Stop이 되었다가 다시 시작될 때 호출된다.
기존에 저장된 cache 데이터로 부터 화면을 복구한다.
onStart()
Activity가 실제로 화면에 보이게 될 때 호출된다.
Start when visible-only behaviors
Loading persistent application state
onResume()
유저의 인풋을 받을 수 있게 되는 시점이다.
Foreground 관련 작업을 시작한다. (센서 이벤트 핸들링, UI 업데이트 등)
onPause()
부분적으로 보이기는 하지만 포커스를 잃은 상태이다.
Foreground 관련 작업을 중지한다. (센서 이벤트 핸들링, UI 업데이트 등)
persistent state 저장
onStop()
Activity가 유저에게 보이지 않는 상태이다. 향후에 다시 onRestart가 호출되면서 다시 시작될 가능성이 있지만 반면에 메모리가 부족해서 플랫폼에 의해서 kill 될 수도 있다.
restart시 필요한 데이터들을 저장한다. (cache)
onDestroy()
Activity가 종료될 때 호출된다. 다만 플랫폼에서 activity가 강제로 종료되었을 경우에는 호출되지 않을 수도 있다.
사용 중인 리소스를 해제한다.
4. Starting activities
Itent를 만들어서 아래 두 API 중에 하나를 사용하면 된다.
startActivity()
startActivityForResult()
2번의 경우, 대상 Activity의 종료 시에 콜백이 호출되면서 (onActivityResult) 결과 값을 받아 볼 수 있다. 대상 Activity의 경우 아래 API를 이용해서 결과 값을 설정할 수 있다.
public final void setResult(int resultCode)
public final void setResult(int resultCode, Intent data)
5. Handling configuration changes
Activity가 UI를 그리는 역할을 담당함으로써 Activity는 디바이스의 상태 변화에 적절히 대응해야 할 필요가 있다. 아래는 디바이스 상태 변화의 예이다.
언어설정, 스크린 사이즈, 키보드, 디바이스 방향, 로케일 정보 변경
런타임시에 디바이스 설정이 변경되는 경우 (네트워크 설정, 벨소리 설정 등)
다만 중요한 설정 값이 변경될 경우, 안드로이드 플랫폼에서 현재 Activity를 자동으로 kill & restart 시킨다. 따라서 크게 신경 쓸 필요는 없지만 만약 필요하다면 메뉴얼하게 Java 코드에서 핸들링 할 수는 있다. 하지만 관련된 API들이 모두 ‘deprecated’ 되고 있고 향후에 어떤 configuration이 추가될지 알 수 없는 상황이기 때문에 메뉴얼하게 configuration을 대응하게 되면 다른 환경, 디바이스에서 문제를 일으킬 수 있다. 따라서 사용하지 않는 것이 좋다.
6. 시리즈 연재
'소프트웨어 > 안드로이드앱' 카테고리의 다른 글
[안드로이드 기초#5] 권한 (Permission) (0) | 2015.07.03 |
---|---|
[안드로이드 기초#4] 인텐트 (Intent) (0) | 2015.07.02 |
[안드로이드 기초#2] 어플리케이션 기본 (0) | 2015.06.30 |
[안드로이드 기초#1] 플랫폼과 개발환경 (1) | 2015.06.29 |
안드로이드 스튜디오의 유용한 단축키 (3) | 2015.06.28 |