Android, iOS

launchMode도 모르고 액티비티 인스턴스를 관리했다니...

미스터머글 2020. 4. 19. 21:26
728x90
반응형

최근에 launchMode에 대해서 알고 있느냐는 질문을 받았다.

"음? launchMode? 그게 뭔가요?"

"그럼 액티비티 인스턴스는 어떻게 관리했나요?"

"......"

 

생각해보니 내가 그런걸 염두하고 개발을 안했던거 같다.

 

실화다.

 

늦기 전에 지금이라도 알아보자.

launchMode로 액티비티 인스턴스 관리하기.

 

1. launchMode의 용도

우선 공식문서에는 뭐라고 했는지 들여다 보았다.

액티비티를 시작하는 방법에 대한 지침입니다. 인텐트를 처리하기 위해 액티비티를 호출할 때 발생하는 것을 결정하기 위해 Intent 객체에서 액티비티 플래그(FLAG_ACTIVITY_* 상수)와 함께 작동하는 4개의 모드가 있습니다.

항상 느끼지만 공식 문서의 번역은 조금 이해하기 힘들다.

다른 분들의 자료를 참고삼아 내용을 좀 풀어보겠다.

액티비티를 실행하면 태스크라고 하는 액티비티로 구성된 단위에 해당 액티비티가 쌓이게 된다.

이 태스크는 스택으로 쌓이게 된다.

이 때 그냥 스택 가장 상단에 쌓을지 이미 존재하는 인스턴스를 별도로 관리할 건지 결정하는 것이 launchMode이다.

 

2. launchMode의 Flag

4개의 모드가 있다고 하니 하나씩 들여다보자.

  • standard (Default)
    • 별도로 launchMode를 지정하지 않으면 standard로 지정이 된다.
    • 액티비티를 호출하는 것 마다 계속 스택에 쌓게 된다.
  • singleTop
    • singleTop으로 지정된 액티비티가 존재하고 이 액티비티의 인스턴스가 이미 스택에 존재하고 있을 때
    • 해당 액티비티로 또 호출하면 상위 액티비티의 onNewIntent()가 수행되면서 기존 인스턴스를 재활용하게 된다.
    • 예시
      • 스택 : A -> B -> A
      • A를 또 호출 : A -> B -> A(재활용)
  • singleTask
    • 재활용을 한다. 그런데 singleTop과 헷갈리면 안된다.
    • 태스크의 루트에만 존재할 수 있다.
    • 그럴려면 방법은 하나, 해당 액티비티는 새로운 태스크를 만듦과 동시에 본인의 인스턴스를 생성한다.
    • 이 액티비티의 인스턴스가 이미 존재한다면 다른 액티비티에서 이 액티비티를 부를 때 해당 인스턴스를 재활용한다.
    • 예시
      • 스택 : A -> B
      • singleTask로 지정된 C 호출 : A -> B // C (A, B가 담긴 태스크와 별도의 태스크)
      • 일반 D 호출 : A -> B // C -> D
  • singleInstance
    • 간단하다. 하나의 태스크에 오직 하나의 인스턴스만 들어간다.
    • 태스크와 인스턴스가 매번 새로 호출된다.
    • 예시 : A // B // C

 

3. 용어 정리

헷갈릴까봐 미리 여기 남겨본다.

  • 스택, 태스크, 백스택, 모두 같은 의미로 보면 된다.
  • 다중 인스턴스 지원 여부
    • 지원 : standard, singleTop ( singleTop 은 조건부 지원 )
    • 지원 안함 : singleTask, singleInstance

 

참고 링크
- https://choboit.tistory.com/24 (추천)
- https://black-jin0427.tistory.com/45

 

728x90
반응형