본문 바로가기

프로그래밍/안드로이드

[안드로이드] 액티비티와 태스크


하나의 액티비티는 또 다른 액티비티를 시작시킬 수 있다고 했습니다.
[안드로이드] 컴포넌트 #1 - 액티비티(Activity)

그렇게 시작할 수 있는 액티비티에는 다른 어플리케이션이 정의한 액티비티도 포함되는데요,
예를들어, 사용자에게 지도를 보여주고싶다면, 이미 안드로이드에 지도 위치를 보여주는 액티비티가 존재하기 때문에 , 필요한 것은 인텐트 객체에 필요한 정보를 추가한 뒤
그것을 startActivity() 의 파라미터로 전달하는 것 뿐입니다.
그러면 맵 뷰어는 지도를 보여주게 되고 , 사용자가 " BACK " 키를 누르면 다시 기존의 액티비티가 화면에 나타나겠지요.

맵 뷰어는 다른 어플리케이션 내에 정의되고 있고 다른 어플리케이션의 프로세스 상에서 실행되고 있지만 사용자에게는, 지도가 동일한 어플리케이션의 일부분으로 보여질 것입니다.

두개의 액티비티를 같은 태스크 내에 유지함으로써 이런 사용자 경험 ( user experience ) 을 유지합니다. 즉 태스크는 하나의 어플리케이션처럼 사용자들이 경험하는 그 무엇 입니다.


태스크

태스크는 하나의 스택(stack) 내에 정렬된 액티비티들의 그룹입니다.
스택의 루트(root) 액티비티는 그 태스크를 시작했던 액티비티가 됩니다. [ 일반적으로 사용자가 어플리케이션 런처에서 실행했던 액티비티 ] .

하나의 액티비티가 다른것을 시작할 때 새로운 액티비티는 스택에 올려지며 (push) 실행상태가 되죠.
이전 액티비티는 여전히 스택에 남아있고 사용자가 "BACK" 키를 누르면 현재 액티비티는 스택에서 제거(pop)되고 , 이전의 액티비티는 실행상태로 재개(resume) 되는 구조입니다.

스택은 객체들을 포함하고 있습니다. 그러므로 태스크가 동일한 액티비티 하위클래스의 인스턴스를 하나 이상 가지고 있다면 ( 여러개의 맵 뷰어 처럼 ) , 스택은 각각의 인스턴스에 대한 별도의 시작점을 가집니다.
[ 스택에서 액티비티는 절대 재정렬 되지 않고, 단지 푸시(push) 되고 팝(pop) 될 뿐 입니다. ]

태스크는 매니페스트에 있는 클래스나 앨리먼트가 아니라, 액티비티에 대한 스택입니다.
태스크에 대한 값은 루트 액티비티에 의해 설정되며, 태스크의 액티비티와 독립적으로 그 값을 설정할 방법은 없지요.

태스크 안에서 모든 액티비티는 하나의 단위로 함께 움직이는데요, 전체의 태스크 ( 전체의 액티비티 스택 ) 는 포그라운드(foreground) 로 가져올 수 있고, 백그라운드(background)로 보내질 수 있습니다.

예를들어 현재 "A" "B" "C" "D" 라는 알파벳 1글자씩을 보여주는 4개의 액티비티를 가진 태스크가 스택에 있다고 해보죠. 세개의 액티비티는 현재 액태비티의 아래에 위치해 있습니다. 이 태스크를 "X" 라고 칭하겠습니다.

여기서 사용자는 "D" 라는 화면을 보고 있습니다.


사용자가 "HOME" 키를 눌러 어플리케이션 런처로 이동한 후 새로운 어플리케이션 ( 실제 새로운 태스크) 을 실행합니다. 이 태스크를 "Y" 로 칭하겠습니다.
그러면 X 태스크는 백그라운드로 이동되고, Y태스크에 대한 루트 액티비티가 화면에 보여집니다.

잠시 후,,, 사용자가 다시 "HOME" 키를 누른 뒤 이전의 어플리케이션 ( 이전 태스크 : X 태스크 ) 을 실행합니다. X 태스크가 포그라운드로 다시 옵니다.
이 상태에서 "BACK" 키를 누르면 Y태스크의 액티비티가 보여지는 것이 아니라, X태스크의 상위 액티비티는 제거되고 같은 태스크내의 이전 액티비티가 보여집니다.
즉, 사용자는 "C" 라는 화면을 보게 되겠죠.


이런 동작 방식이 액티비티와 태스크의 디폴트 동작 방식입니다.
이런 동작 방식을 수정할 수도 있는데요, 동작 방식은 매니페스트 내의 <activity> 앨리먼트에 설정된 속성과, 액티비티를 시작시켰던 인텐트 객체 내에 설정된 플래그에 의해 제어됩니다.

즉, 인텐트를 요청하는 쪽과 그것에 응답하는 쪽 모두가 동작방식에 관여할 수 있는 구조입니다.



주요 인텐트 플래그
FLAG_ACTIVITY_NEW_TASK
FLAG_ACTIVITY_CLEAR_TOP
FLAG_ACTIVITY_RESET_TASK_IF_NEEDED
FLAG_ACTIVITY_SINGLE_TOP


주요 <activity> 속성
taskAfinity
launchMode
allowTaskReparenting
clearTaskOnLaunch
alwaysRetainTaskState
finishOnTaskLaunch


출처 : http://underclub.tistory.com/279