상세 컨텐츠

본문 제목

[Android]액티비티와 태스크

Android 개발

by mobile 2013. 9. 9. 23:00

본문

반응형

- Activity 와 Task

액티비티의 이력을 관리해 주는 메커니즘(이를 Task 라 부른다)

안드로이드 태스크는 어떤 면에서 보면 컴포넌트의 모임이다. 사용자가 액티비티를 호출할 때 마다 액티비티 태스크라는 장소에 차곡차곡 쌓여지게된다. 안드로이드는 태스크를 액티비티가 쌓여 있는 스택이라 하여 액티비티 스택(Activity Stack)이라 표현한다.


- Stack : 영역 실행과 환경변수와 로컬변수

- Heap : 동적으로 설정하는 데이터 영역

- Static : 데이터 영역

- 실행코드


액티비티나 다른 컴포넌트들이 실행 전에는 애플리케이션이라는 파일 내에 존재하지만, 실행시점에서는 프로세스내 태스크에 존재하게 된다. 안드로이드에서 이야기 하는 태스크는 사용자에게 보여지는 다양한 종류의 컴포넌트들의 집합으로 전통적인 의미의 작업 단위라는 개념을 갖는 태스크와 구분된다. 커널에서 태스크라는 용어는 스레드를 의미한다.


사용자가 화면상의 애플리케이션의 아이콘을 터치하면 애플리케이션내 액티비티 프로그램이 시작하게된다. 애플리케이션은 태스크를 사용하여 스택 형태로 구성하게되며, 스택의 가장 아래는 처음 시작한 액티비티를 루트 액티비티(Root Activity)이란 이름으로 놓게된다.


Root Activity는 애플리케이션의 AndroidManifest.xml 내 intent-filter 요소에 MAIN으로 선언된 액티비티를 말한다. 루트 액티비티는 사용자가 선택하여 실행되는 최초의 액티비티를 말한다.


같은 액티비티라 하더라도 스택내 다수 액티비티의 인스턴스를 가질 수 있다. 액티비티의 인스턴스들은 서로 다른 설정환경이나 메모리 번지수등을 갖게 된다. 따라서 안드로이드는 개별적인 액티비티나 또는 다른 컴포넌트들을 구분하기 위해 Context라는 객체로 구분하게된다.


스택내 액티비티는 재정렬되지 않으며, 호출된 순서대로 유지하게된다.


태스크와 스택은 전체적으로 실행되는 프로세서의 수를 줄일 수 있는 특징을 제공한다. 액티비티가 호출될때 마다 프로세스를 만드는 것보다 태스크로 관리하면서 조절하는 것이 CPU와 메모리를 효율적으로 사용하는 방법을 제공하고 전체적인 애플리케이션 관리에 있어 더욱 효과적이다.


참고로 커널의 작업 스케줄은 프로세스를 기본단위로 한다. 그리고 프로세스 내 세부 작업 스케줄은 스레드 단위로 구분되어 이루어진다.


- 액티비티의 실행 모드

Launch Mode(실행모드)는 액티비티를 태스크내에서 인스턴스화하는 방법에 따라 " 다른 액티비티와 태스크를 공유하느냐" 또는 "공유하지 않는냐" 그리고 "어떤 액티비티가 최하위 루트 액티비티가 되는냐"에 따라 크게 네개의 모드로 나누어 진다.

▶ standard 모드는 인텐트로 인해 액티비티의 인스턴스가 생성한다면 호출한 액티비티와 동일한 태스크내에 만들어 진다.


▶ singleTop 모드는 새로운 인스턴스를 생성하는 과정에서 태스크내 스택에 최상위 액티비티의 인스턴스가 존재한다면 새롭게 인스턴스를 생성하지 않고 기존 인스턴스가 인텐트를 받아 처리한다. 인텐트내 Intent.FLAG_ACTIVITY_SINGLE_TOP 플래그를 사용하여 호출하는 방법과 동일하다.


▶ singleTask 모드는 다른 액티비티들과 같은 태스크를 공유하지만 항상 스택의 로트 액티비티로 존재한다.


 singleInstance 모드는 생성된 액티비티는 어떤 다른 액티비티등과 동일한 태스크를 공유하지 않는다. 즉, 유일한 액티비티로 존재하고 다른 액티비티를 싱행한다면 새로운 태스크를 할당 받아야 한다.


standard 모드를 가지는 액티비티는 하나의 태스크내 인스턴스가 이미 존재하더라도 여러개의 인스턴스를 생성한다. 반면에 singleTop 모드의 액티비티는 스택내 자신의 위치에 따라 새롭게 인스턴스를 생성하거나 또는 생성하지 않을 수 있다.


singleTask 모드와 singleInstance 모드의 액티비티는 하나의 태스크내에서 무조건 하나의 액티비티 인스턴스만 존재한다.


singleTask 모드와 singleInstance 모드를 갖는 액티비티는 액티비티 매니페스트내 인텐트 필터로 반드시 MAIN과 LAUNCHER의 선언이 필요하다. 사용자가 다른 액티비티를 호울한 이후 원래 액티비티로 복귀를 원하지 않는다면 매니페스트의 액티비티 요소내 android:finishOnTaskLaunch 속성으로 true를 입력하면된다. 


일반적으로 'standard' 모드로 작동하는 액티비티가 이미 태스크내 최상위 스택에서 실행되고 있는 상태에서 인텐드를 사용하여 해당 액티비티를 호출하면 새롭게 액티비티의 인스턴스를 생성하여 실행하게된다.


그러나 인텐트내 FLAG_ACTIVITY_SINGLE_TOP 플래그를 사용하여 작업을 요청한다면, 실행중인 액티비티는 별도 액티비티의 인스턴스를 생성하지 않고 기존 액티비티내에서 다음과 같이 onNewIntent() 콜백 메서드를 호출하여 초기화 작업을 수행하게된다. 'SingleTop' 모드로 싱행하는 액티비티는 개발자가 새롭게 수신한 인텐트를 위해 onNewIntent() 메서드를 오버라이드하고 setIntent() 메서드를 사용하여 인텐트를 업데이트해 주어야 한다.


- 태스크내 액티비티 관리

 alwaysRetainState 속성 : 태스크의 루트 액티비티에 이 속성을 설정하면 이 태스크는 오랜시간이 지다도 생존하게 된다. 

 clearTaskOnLaunch 속성 : 태스크의 루트 액티비티에 이 속성을 설정하면 스택내 아무리 많은 액티비티들이 쌓여 있다 하더라도 태스크를 나간다면, 루트 액티비티를 제외하고 다른 모든 액티비티들은 삭제하게 된다.

 finishOnTaskLaunch 속성 : clearTaskOnLaunch 속성과 유사하나 이 속성은 액티비티에만 유효하다. true로 설정한다면, 액티비티를 다시 실행한다면 이전 태스크는 삭제되고 새로운 태스크로 액티비티가 실행된다.


인텐트 객체의 플래그로 FLAG_ACTIVITY_CLEAR_TOP 으로 설정하면 인텐트를 처리할 액티비티가 태스크내 이미 인스턴스를 가지고 있다면 상위 액티비티들이 모두 삭제되고 해당 액티비티가 최상위 액티비티로 만들어지게 된다.


인텐트 객체에 플래그에 FLAG_ACTIVITY_NEW_TASK 와 FLAG_ACTIVITY_CLEAR_TOP 이 함께 사용되면 태스크내 상위 액티비티를 제거할 수 있다.


FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET 플래그는 현재 스택상에 액티비티가 존재한다면 자신의 상위 액티비티들을 모두 제거하게된다.

반응형

'Android 개발' 카테고리의 다른 글

[Android]사용자가 만든 토스트  (0) 2013.09.15
[Android]Menu 인플레이터  (0) 2013.09.15
[Android] 인텐트 - 03  (0) 2013.08.01
[Android] 인텐트 - 02  (0) 2013.07.31
[Android] 인텐트  (0) 2013.07.31

관련글 더보기

댓글 영역