출처 :  http://chihun80.springnote.com/pages/5715069 

안드로이드 입문서 3rd Edition을 읽으며 요약한 내용입니다. 열공!

Section 2. 애플리케이션의 기초(3)



액티비티와 태스크

태스크 : 하나의 스택 내 정렬된 관련 액티비티들의 그룹

  • 스택 내 루트 (최하위) 액티비티 - 태스크를 시작했던 액티비티. 일반적으로 사용자가 애플리케이션 시작을 위해 런처에서 선택했던 액티비티
  • 스택 내 최상위 액티비티 - 현재 실행 중인 (포커스 된) 액티비티
  • 하나의 액티비티가 다른 액티비티를 시작하면 새로운 액티비티는 스택에 푸쉬됨 (따라서 최상위 액티비티가 됨)
  • 사용자가 BACK 키를 누르면 현재의 액티비티는 스택에서 팝되며, 이전 액티비티가 (최상위 액티비티가 되어) 실행이 재개됨. 스택에서 액티비티는 푸쉬되고 팝 될 뿐, 결코 재정렬되지 않음
  • 태스크가 동일 액티비티(오브젝트 형태)의 인스턴트를 한 개 이상 가지면 -> 스택이 각 인스턴트에 대한 별도의 시작점을 가짐
  • 태스크는 독립적으로 설정되지 않고, 루트 액티비티에 따라 값이 결정 됨

태스크와 액티비티 작동의 예

 



태스크와 액티비티 간의 동작방식설정 : 매니페스트 내 액티비티 엘리먼트 애트리뷰트 설정 + 인텐트 오브젝트 내 플래그

  • 디폴트 -  태스크 안에서 모드 액티비티가 하나의 단위로 움직임
  • 매 니페스트 내 액티비티 엘리먼트의 애트리뷰트 : taskAffinity, launchMode, allowTaskReparenting, clearTaskOnLaunch, alwaysRetainTaskState, finishOnTaskLaunch
  • 액티비티를 활성화할 때 사용되는 인텐트 오브젝트 내 설정된 플래그 : FLAG_ACTIVITY_NEW_TASK, FLAG_ACTIVITY_CLEAR_TOP, FLAG_ACTIVITY_RESET_TASK_IF_NEEDED, FLAG_ACTIVITY_SINGLE_TOP


어피니티와 신규 태스크

  • 디폴트 - 동일 태스크 내에 속하는 액티비티의 어피니티는 동일함
  • But, 액티비티 엘리먼트의 taskAffinity 애트리뷰트를 이용, 각각의 액티비티에 대한 개별적인 어피니티 설정도 가능
    • 다른 애플리케이션들이 정의된 하나의 어피니티를 공유할 수도 있음
    • 같은 애플리케이션 내에 정의된 액티비티들에게 서로 다른 어피니티가 지정될 수도 있음
  • 어피니티가 동작할 수 있는 두 가지 조건
    • 액티비티를 런치하는 인텐트 오브젝트가 FLAG_ACTIVITY_NEW_TASK 플래그를 포함함
    • 매니페스트에서 액티비티의 allowTaskReparenting 애트리뷰트가 true로 설정됨

 

  • FLAG_ACTIVITY_NEW_TASK 플래그
    • 디폴트 - 새로운 액티비티는 startActivity()를 호출한 액티비티와 동일한 태스크 안에 런치됨
    • But, 인텐트 오브젝트에 FLAG_ACTIVITY_NEW_TASK 플래그가 포함되어 startActivity()의 파라미터로 전달된 경우
      • 신규 액티비티와 동일한 어피니티를 가지는 태스크가 존재 - 액티비티는 그 태스크 내에서 런치됨
      • 신규 액티비티와 동일한 어피니티를 가지는 태스크가 없음 - 신규 태스크가 런치됨

 

  • allowTaskReparenting 애트리뷰트
    • allowTaskReparenting = true : 원래 태스크에서 어피니티를 가진 태스크로 이동할 수 있음


런치 모드

  • 액티비티의 launchMode 애트리뷰트 - standard, singleTop, singleTask, singleInstance 중 하나의 값을 가짐

 

  • 어떤 태스크가 인텐트에 응답하는 액티비티를 보유하는가?
    • standard 혹은 singleTop 모드 액티비티가,
      • FLAG_ACTIVITY_NEW_TASK가 없는 인텐트를 받았을 때 -> startActivity()를 호출했던 액티비티가 있는 태스크에 인텐트에 응답하는 액티비티가 나타남
      • FLAG_ACTIVITY_NEW_TASK가 있는 인텐트를 받았을 때 -> 신규, 혹은 동일한 어피니티를 갖는 다른 태스크에 인텐트에 응답하는 액티비티가 나타남
    • singleTask 혹은 singleInstance 모드 액티비티는,
      • 항상 태스크의 루트 액티비티로 나타남. 결코 다른 태스크 안으로 런치되지 않음

 

  • 액티비티에 대한 인스턴스가 여러 개 존재할 수 있는가?
    • standard 혹은 singleTop 모드 액티비티는,
      • 여러 번 인스턴스화 될 수 있음
      • 다양한 태스크에 속할 수 있으며, 한 태스크가 동일한 액티비티에 대한 여러 개의 인스턴트를 가질 수 있음
    • singleTask 혹은 singleInstance 액티비티는,
      • 하나의 인스턴트로만 제한됨
      • 태스크 내 액티비티 인스턴트가 디바이스 상에 동시에 하나 이상 존재할 수 없음

 

  • 액티비티의 인스턴스가 그것의 태스크에 다른 액티비티를 가질 수 있는가?
    • singleInstance 모드 액티비티는,
      • 태스크 내에서 유일한 액티비티로 존재
      • 이 액티비티가 다른 액티비티를 호출하면 호출된 액티비티의 모드와 상관없이 별도의 태스크에서 런치됨
    • singleTask 모드 액티비티는
      • 항상 태스크의 루트 액티비티로 존재
      • singleInstance와 비슷하나 태스크 내 다른 액티비티들을 호출할 수 있음
    • standard와 singleTop 액티비티의 인스턴스는 스택 어디에나 존재 가능

 

  • 새로운 인스턴스가 새로운 인텐트를 처리하기 위해 런치될 것인가?
    • standard 모드 액티비티는,
      • 새로운 인스턴스가 모든 신규 인텐트에 응답하도록 생성됨
      • 각각의 인스턴스는 단지 하나의 인텐트를 처리함
    • singleTop 액티비티는,
      • 태스크의 최상위에 존재 - 이미 존재하는 인스턴스가 신규 인텐트 처리를 위해 재사용
      • 태스크의 최상위에 존재하지 않음 - 신규 인텐트를 위한 새 인스턴스 생성, 스택에 최상위로 푸쉬됨

 

액티비티의 위치 및 모드에 따른 인텐트 처리결과

 

  • singleInstance 모드 액티비티는,
    • 태스크에 있는 유일한 액티비티. 따라서 항상 최상위에 있으며, 모든 인텐트를 처리함
  • singleTask 모드 액티비티는,
    • 다른 액티비티가 최상위에 있는 경우는 인텐트가 누락될 수 있음
    • 인텐트가 누락되더라도 태스크 자체는 포어그라운드로 올라옴

 

  • BACK 키를 눌렀을 때,
    • 이전 액티비티 인스턴스로 돌아감 (최상위 인스턴스가 팝되어 나감)
    • 새 인텐트로 인해 기존 액티비티 인스턴트가 변하였을 때 BACK 키로 이전 상태로 가는 것은 불가능


스택 제거

  • 디폴트 - 사용자가 오랫동안 하나의 태스크를 떠나 있다면, 시스템이 루트 액티비티를 제외한 모든 액티비티를 제거함
  • alwaysRetainTaskState 애트리뷰트 = true - 긴 시간 방치된 태스크가 그대로 유지됨
  • clearTaskOnLaunch 애트리뷰트 = true - 사용자가 태스크를 떠나는 즉시 루트 액티비티를 제외한 모든 것을 지움
  • finishOnTaskLaunch 애트리뷰트 = true - 사용자가 태스크를 떠나면 루트 액티비티를 포함한 모든 것을 지움

 

  • FLAG_ACTIVITY_CLEAR_TOP 플래그
    • 인텐트 오브젝트가 이 플래그를 가지고 있고 타겟 태스크 스택 내에 인텐트를 처리할 수 있는 타입의 액티비티 인스턴트가 이미 있다면, 이 액티비티 인스턴트가 최상위 액티비티가 되어 응답하도록 그 위의 액티비티를 모두 제거
    • 만약 지정된 액티비티가 standard 모드이면 이 액티비티도 지워지고 새로운 액티비티 인스턴트가 생성됨
    • FLAG_ACTIVITY_CLEAR_TOP은 거의 대부분 FLAG_ACTIVITY_NEW_TASK와 함께 쓰임


태스크 시작하기

  • android.intent.action.MAIN + android.intent.category.LAUNCHER : 태스크에 대한 시작점이 됨
    • 액티비티의 아이콘과 라벨이 애플리케이션 런처에 보여지게 함
    • 언제든지 태스크로 다시 돌아갈 수 있게 함
  • singleTask와 singleInstance 모드 액티비티는 MAIN과 LAUNCHER 필터를 가지고 있을 때만 사용되어야 함
    • 만약 아니라면 백그라운드로 보낸 후 다시 포어그라운드로 불러올 수 없음 (태스크가 백그라운드에서 미아가 됨)
  • FLAG_ACTIVITY_NEW_TASK 플래그 사용 시에도 마찬가지
    • 이 플래그를 포함한 인텐트에 의해 호출될 수 있는 액티비티를 애플리케이션이 포함한다면, 사용자가 시작된 태스크로 다시 돌아갈 수 있는 방법을 제공해야 함
  • 돌아가기를 원치 않는다면 finishOnTaskLaunch를 true로 설정하여 태스크를 떠나는 즉시 지울 것

'Android > Tip&Tech' 카테고리의 다른 글

[펌]ViewPager 에 관한 설명  (0) 2012.02.17
ProgressBar 이미지 커스터마이징하기  (0) 2012.02.08
안드로이드 최신버전 확인하기  (0) 2012.01.30
마켓 링크 확인하기  (1) 2012.01.30
Lists and focuses in button  (1) 2012.01.26

+ Recent posts