2008 2010 Korea Android
Open Access (Open Devices,Open Applications,Open Services,Open Networks)
www.kandroid.org »
안드로이드 Application 
[translation] Android Fundamental 중 Activity와 Task
작성자 삼스
작성일 2009-05-08 (금) 14:37
ㆍ추천: 9  ㆍ조회: 2043      
IP: 116.xxx.2
 
activity와 task가 안드로이드에 특화된 개념인데다 개념이 좀 헤깔려서 정리하는 차원에서 Android Fundamental web page를 나름 막장번역해보았습니다. 막장번역이다 보니 의역도 많고 잘못 번역된 곳도 있을 것 같아서 많은 분들이 한번씩 보시고 교정을 좀 보아주시면 안될까요?
 
http://developer.android.com/guide/topics/fundamentals.html
 
<원문 번역>
Activity & Task
 하나의 activity는 다른 activity를 시작할 수 있고 다른 application의 activity도 시작할 수 있다. 예를 들어 임의위치의 street map을 display한다고 가정하자, 이런 작업을 하는 activity는 이미 제공된다. 따라서 당신의 activity에서 이 activity를 시작하기 위해 해야 할 일은 필요한 정보를 포함하는 intent object를 startActivity()에 파라메터로 전달하여 호출하는것 뿐이다. 이렇게 하면 street map viewer가 표시될것이다. 이 때 BACK버튼을 누르면 viewer를 시작한 당신의 activity가 다시 보여질 것이다.
 이는 사용자로 하여금 street map viewer가 당신의 application의 일부라고 느끼게 한다. 하지만 실제로는 그 activity는 다른 app의 다른 process상의 activity이다.
 안드로이드는 이처럼 사용자가 사용한 activity들을 task로 하여 그 정보를 유지한다. 관련된 activity는 group으로 stack에 저장된다.
 root activity는 task상의 첫번째 activity이고 top activity는 현재 화면에 보여지는 activity이다. activity가 다른 activity를 시작하면 그 새로운 activity가 stack에 push되고 그 activity가 top activity가 된다. 그리고 이전 activity는 stack에 남아 있는다. 이 상태에서 사용자가 BACK버튼을 누르면 이전 activity가 stack에서 POP되어 화면에 보여지게 되어 resume된다.
stack은 activity의 object(instance)를 가지고 있다. 따라서 같은 activity의 여러개의 instance가 가능하다. 같은 activity를 여러개 시작할수 있다는 의미이다.
 stack내의 activity는 stack이므로 재정렬되지 않는다. 순서는 그대로 유지되게 된다. 단지 PUSH, POP만 된다.
Task는 activity들의 stack이다. 따라서 task내의 activity에 어떤 값을 설정하는 방법은 없다. root activity만이 affinity(친밀도) set을 이용하여 read, set이 가능하다.
Task의 모든 activity들은 하나의 집합으로 background또는 foreground로 이동한다. 현재 Task가 4개의 activity를 가진다고 가정해보자. HOME 키를 누르면 application launcher로 이동한다. 이어서 새로운 application을 실행한다. 그러면 현재 task는 background로 가고 새로운 task의 root activity가 표시된다. 이어 사용자가 다시 HOME으로 갔다가 이전 application을 다시 선택한다면 그 task가 다시 앞으로 나온다. 이 때 BACK키를 누르면 root activity가 표시되지 않고 task상의 이전 activity가 표시된다.

      A1 -> A2 -> A3 -> A4 -> HOME -> B 1-> B2 -> HOME -> A4 -> BACK -> A3

task와 activity간의 결합과 동작에 대한 제어는 intent object의 flag 파라메터와 minifest의 <activity> element의 몇가지 속성으로 제어가 가능하다.

    flag -> FLAG_ACTIVITY_NEW_TASKFLAG_ACTIVITY_CLEAR_TOP, FLAG_ACTIVITY_RESET_TASK_IF_NEEDED, FLAG_ACTIVITY_SINGLE_TOP
    <activity>'s attributes -> taskAffinity, launchMode, allowTaskReparenting, clearTaskOnLaunch, allowRetainTaskState, finishOnTaskLaunch

Affinityes and new Tasks
 기본적으로 하나의 application의 activity들은 각기 하나의 affinity를 갖는다. 그러나 각각의 affinity들은 <activity> element의 taskAffinity속성으로 affinity set을 이룰수 있다. 서로 다른 application의 activity들이 동일한 affinity를 공유할 수 있으며 한 application의 activity들이 서로 다른 affinity를 가질수 있다. affinity는 intent object에 FLAG_ACTIVITY_NEW_TASK로 activity를 적재할 때와 activity가 allowTaskReparenting속성을 true로 set하였을 때 시작된다.

FLAG_ACTIVITY_NEW_TASK 적용시
 앞서 기술한대로 기본적으로 activity는 startActivity()로 task안에 적재된다. caller와 동일한 stack에 push된다. 그러나 startActivity()가 FLAG_ACTIVITY_NEW_TASK 로 flag를 set하여 호출하면 시스템은 새로운 activity를 담기위한 task를 찾는다. 보통 새로운 task가 생성되지만 동일한 affinity를 갖는 task가 검색되면 그 태스크에 가서 달라붙는다.

allowTaskReparenting 적용시
 특정 activity가 allowTaskReparenting속성이 "true"이면, 시작된 task에서 동일한 affinity를 갖는 다른 task가 foreground로 올라올때 그 task로 activity가 이동될 수 있다. 예를 들면, 특정도시의 날씨를 보여주는 activity를 가지고 있는 travel application이 있다고 하자. travel application에 동일한 affinity를 갖는 다른 activity가 있고 reparenting이 가능하다. 이 상태에서 당신의 application의 activity가 travel application의 날씨 activity를 시작하면 날씨 activity는 당신의 task에 적재되게 된다. 그러나 이 때 travel application이 적재되게 되면 날씨 activity는 새로 시작된 travel application의 task에 재위치지정이 되고 화면에 표시되어진다.

travel application : Weather activity, ... -> allowTaskReparenting이 true이고 모두 동일 affinity를 갖는다.
your application : A, B, C, D activity

 launch travel application -> (1)start Weather activity -> HOME -> launch your application -> start A activity -> (2)start Weather activity -> HOME -> (3)travel application -> display Weather activity
  
(1) 시점에서 weather activity는 task1(travel app의 task)에 적재된다. (2)시점에서 weather activity는 task2(your app의 task)에 적재된다. (3)의 시점에서 travel app가 다시 시작될때 task2에 있던 weather activity가 task1으로 재지정되게 된다.
 
하나의 패키지(*.apk)에 여러 application이 정의되어 있다면 app단위로 각기 다른 affinity를 부여하는것이 좋다.

Launch Mode
 <activity> element에 lounchMode 속성을 조정하여 activity를 컨트롤할 수 있다. 

            standard, singleTop, singleTask, singleInstance

 위 4가지 모드는 4가지 관점에서 다르게 동작한다.
* 임의 Intent에 대해 어떤 task가 그 activity를 받을 것인가?
 standard, singleTop모드는 intent가 발생된 task에 push된다. flag를 FLAG_ACTIVITY_NEW_TASK로 설정해도 호출한 동일한 task내에 push된다. 위에 기술한 affinity & new task에 따라 다른 task가 선택될수 있다.
 singleTask및 singleInstance는 task를 정의하여 root activity로 적재되고 다른 task에 적재되지 않는다.
* 다중 instance activity가 가능한가?
standard, singleTop모드는 여러 task에 소속될수도 있고 한 task에 동일한 activity가 여러 instance가 적재될수도 있다. 
singleTask, singleInstance는 task내에서 오로지 한개의 instance만 적재된다. root activity만 가능하기 때문에 device내에서 한번에 하나의 Instance만 존재할 수 있다.
* Instance가 task내에서 다른 activity를 가질수 있는가?
 singleInstance는 task내에서 오직 하나의 instance만 가능하며, 만일 다른 activity를 시작하면 launchMode에 관계없이 새로운 task가 생성되어 적재된다.
 standard, singleTask, singleTop은 모두 multi instance가 가능하다. singleTask는 root activity로 생성되며 다른 activity를 task내에 적재가 가능하다. singleTop과 standard모드는 stack내에서 자유롭게 다른 activity를 생성가능하다.
* 특정 class의 새로운 instance가 새로운 intent를 다룰것인가?
 standard모드는 새로운 instance가 새로운 intent의 응답으로 생성된다. 각 instance는 오직 하나의 intent를 다룬다.
 singleTop : target-task의 stack에 top activity로 있다면 그 class의 instance가 intent를 재사용하여 처리한다. top activity가 아니면 재사용하지 않고 새로운 instance가 생성되어 intent를 처리하고 stack에 push된다.

예) A - B - C - D에서 D를 시작하려고 할 때  D가 singleTop이면 A - B - C - D 로된다.
     A - B - C - D에서 D를 시작하려고 할 때  D가 standard이면 A - B - C - D - D 로된다.
     B가 singleTop이나 standare이면 A - B - C - D - B 가 가능하다.
    

Clearing the stack
  기본적으로 사용자가 task를 오랫동안 사용하지 않으면 system은 task의 root activity만을 제외하고 모든 activity들을 clear한다. <activity>element의 몇가지 속성은 이를 조정할 수 있게 해준다.

alwaysRetainState 속성
  task의 root activity에 이 속성을 set하면 이 task는 오랜시가이 지나도 생존하게 된다.
clearTaskOnLaunch 속성
  task의 root activity에 이 속성을 set하면 task를 나가고 돌아올때 clear된다.
finishOnTaskLaunch
  clearTaskOnLaunch와 유사하나 이 속성은 하나의 activity에만 유효하다. root activity를 포함하여 현재 세션인 경우에만 살아있고 task를 떠나면 clear된다.

  stack에서 activity를 제거하는 다른 방법이 있다.
  intent object의 flag를 FLAG_ACTIVITY_CLEAR_TOP로 하고 이 intent를 처리할 activity가 target task에 이미 instance를 가지고 있다면 상위 activity들이 모두 clear되고 그 activity가 top activity가 된다.   launchMode가 "standard"라면 stack에서 마찬가지로 삭제되고 새로운 activity가 그 intent를 처리할 것이다.
  FLAG_ACTIVITY_NEW_TASK와 FLAG_ACTIVITY_CLEAR_TOP이 함께 사용되면 존재하는 activity가 새 task에 생성되어 intent를 처리한다.

Starting task
  activity는 intent filter중에 action filter로 android.intent.action.MAIN를 그리고 category filter로  android.intent.category.LAUNCHER로 entry point가 설정된다. 이런 설정은 icon과 label정보를 가지로 화면에 표시하고 task에 적재하고 적재후 언제든지 다시 돌아올수 있도록 해준다.
  사용자는 언제든 task를 떠날수 있고 다시 돌아올수 있다. singleTask와 singleInstance로 설정된 activity는 반드시 MAIN과 LAUNCHER를 filter로 적용해야 한다. 그러지 않으면 activity를 수행후 다른 화면으로 갔다가 다시 돌아올 수 있는 방법이 없게 된다.

  FLAG_ACTIVITY_NEW_TASK 는 activity하나가 새로운 task에 시작되고 HOME key를 눌렀을 경우 다시 복귀하기 위해 다른 방법이 있다.
  외부 task에서 notification manager같은 entity에서 항상 activity들을 시작할 수 있다. 이런 방식으로 외부에서 activity를 invoke할 수 있다면 사용자가 다른 방법으로 그 task를 시작할 수 있음을 유의해야 한다. 이런 경우 그 activity로 복귀하기를 원하지 않는다면 finishOnTaskLaunch를 사용하면 된다.

이름아이콘 들풀
2009-05-08 14:43
삼스님..아주 중요한 부분을 잘 번역하신듯 합니다.
태스크....!!!! 중요한 개념이죠..~
   
이름아이콘 삼스
2009-05-08 15:47
강의하실때 제가 졸았던것 같습니다. 그래서 다시 정리해본것인데 잘못 이해하고 있는 부분은 없나요?
   
이름아이콘 감성코더
2009-05-08 17:24
와! 정리 잘 해주셨는데요?+_+
Task 개념 정립에 많은 도움이 될 듯 합니다.
   
이름아이콘 mirwing
2009-05-11 13:43
와 감사합니다!... 좋은 공부가 營윱求.>.<
   
이름아이콘 영혼1급수
2009-05-11 16:01
제가 딱 이부분 해석하다가 혹시나 하고 검색해보니 있네요^^
너무너무 감사합니다!!!
   
이름아이콘 노란보라
2009-05-26 11:13
와우~ 멋지십니다. 안드로이드사이드 사이트에서 번역프로젝트를 진행하던데 혹시 그 일부인가요?
(오타 발견 : lounch Mode -> launch Mode ^^;)
   
이름아이콘 김동주
2009-06-12 14:55
역시 번역본을 봐야 이해가 되네요
감사합니다.
   
이름아이콘 tolkien
2009-06-14 00:03
affinity라는 개념이 이해가 되질 않네요.
같은 affinity를 가지면, 동일 task에 적재된다는 건데,
그게 어떤 이득을 가져오는 것이죠?
   
이름아이콘 김동주
2009-06-15 12:39
사용성은 사용자에 따라 편할수도 불편수도 있어 딱히 말할 건 없을 거 같구요.
브라우저 같이 리소스를 많이 쓰는 것들을 하나의 task로 모으지 않고 개별 task마다
띄우다면 문제가 있을 거 같구요. 동일 task는 한꺼번에 종료 할수 있어 편할 거 같습니다.
들풀 동주씨...금요일 저녁 잘 들어가셨나요? ㅎㅎ 한주 잘 보내세요.~ 6/15 13:20
   
이름아이콘 삼스
2009-06-16 16:03
들풀님.. 금요일저녁에 멀 하셨나보근여..
그나저나 오픈프로젝은 어케되가는거져?
들풀 삼스님...오랜만입니다.~
오픈 프로젝트는 이번달을 좀 보내고 본격적으로 할 예정입니다.
일단 내공을 좀 쌓고 있는 중입니다.~~
6/16 17:11
   
 
덧글 쓰기 0
3500
※ 회원등급 레벨 0 이상 읽기가 가능한 게시판입니다.
    N     분류     제목    글쓴이 작성일 조회
참고할만한 안드로이드 Application 목록 [17]+3 들풀 2008-03-07 20319
174 [어플소개]안드로이드용 도로시브라우저 출시 ipanemaboy 2010-09-01 104
173 [어플소개] 직장인에게 필요한 어플인듯 싶어 '모비리더' 명함인식어플~.. youn 2010-09-01 134
172 [뉴스앱] 뉴스 - 모아보다 김공대장 2010-09-01 56
171 PMPal - Project Management Framework Reference for PMI's PMP Exam trinity 2010-08-31 62
170 [예약문자]-[클랜]BookingSMS [1] zerolism 2010-08-30 95
169 모비리더(MobiReader Biz+) 간단하고 손쉽게 명함관리 하세요! 스마트하게 2010-08-24 317
168 프로야구 스코어, 순위, 선수 기록 일정이 궁금할때~Korea Baseball.. 오픈API 2010-08-20 370
167 [어플소개] Wi-Fi 콜렉트콜 전화 날개^^ 2010-08-13 772
166 [어플소개] 후아유(광고성전화나 문자로부터의 해방) - 주요업데이트.. 유깡 2010-08-13 413
165 한국어 음성인식 Lib Update ver 2 - 음성으로 전화걸기 소스 [1] 뿡뿡이아빠 2010-08-12 653
164 스마트 스타트 SmartStart - 시작의 즐거움 kairo 2010-08-12 443
163 [어플소개] 스왑 모음 키보드 (업데이트) - 버그수정 hanwong 2010-08-10 721
162 [어플소개]가나다 입력기 [2] imtheone 2010-08-03 1143
161 픽톡(PicTalk):이야기나눔메신저 소개드려요. ^^ jio 2010-08-03 469
160 <앱소개>한글 입력 Phonic Key [7]+2 Awaken 2010-08-01 1268
12345678910,,,11