Task와 Process의 차이 및 launchMode 정리

Dev Hanna·2023년 12월 19일
1

안드로이드

목록 보기
8/9
post-thumbnail

서론

유니티 APP이 안드로이드 APP 안에 임베디드 되었을 때 내부적으로 어떻게 프로세스가 실행될까?

이 스터디의 키포인트는 Task와 Process를 다룰 줄 알아야 한다는 것이었다. 프로세스를 분리하면 더 많은 힙메모리를 확보할 수 있고 하나가 죽어도 다른 프로세스에는 영향이 없어 안정적인 서비스를 제공할 수 있다. 물론 다른 프로세스간 데이터를 주고받기 위한 추가적인 작업이 필요할 수 도 있지만, 앱인앱 특성상 이미 모듈이 분리된 상태이기 때문에 큰 단점은 아니었다.

<activity
            android:name=".MyUnityActivity"
...
            android:launchMode="singleInstance"
            android:process=":interprocess">

UnityActivity의 태스크와 프로세스 관리를 위해 manifest에 android:process=":{process이름}" 과 android:launchMode="singleInstance" 를 설정했다. 그렇다면 프로세스는 무엇이고, luanchMode 속성 별 차이점은 무엇일까? luanchMode 에 대해 알기 위해서는 Task의 개념을 알아야 한다.

프로세스

  1. 안드로이드 애플리케이션을 실행하는 독립적인 실행단위로 애플리케이션에 존재하는 모든 실행코드와 객체들을 포함한다.

  2. 어플리케이션이 실행되었는데 이미 해당 어플리케이션의 프로세스가 존재할 경우, 모든 구성요소는 동일한 프로세스 내에서 시작되고 동일한 스레드를 사용한다.

  3. menifest에서 activity, service, receiver, provider 등은 android:process 속성으로 특정 프로세스에서 실행하거나 프로세스를 공유할 수 있다.

태스크

  1. 프로세스와는 무관하게 실행되는 액티비티의 정보를 저장하여 화면의 흐름을 관리한다.

  2. 프로세스는 애플리케이션의 모든 실행코드와 객체를 포함하지만 태스크는 애플리케이션이 실행되는 액티비티만을 관리한다. 또한 다른 프로세스의 액티비티를 참조할 수 도 있다.

  3. 앱이 실행되면, 프로세스와 태스크가 각각 생성된다. 프로세스1은 MainActivity 를 메모리 영역에 생성하고 태스크1은 MainActivity를 루트로 등록 할 것이다. 여기서 별도의 프로세스로 UnityAcitvity를 실행하면 프로세스2의 메모리 영역에 UnityActivity가 생성되고 태스크1은 UnityActivity를 참조하여 스택에 쌓아 둔다.
    여기서 뒤로가기 버튼을 눌러 UnityActivity를 종료시키면 태스크는 UnitiyActivity를 스택에서 제거하고 그 밑에 있는 MainActivity 화면을 보여주게 될 것이다. 그리고 UnityActivity가 종료되어 프로세스2가 필요치 않으므로 프로세스2도 종료 될 것이다.

luanchMode

안드로이드는 자동으로 태스크를 관리하지만, 런치모드를 통해 태스크가 관리되는 방식을 설정할 수 있다.

안드로이드 매니페스트에서 설정

  1. standard
  • 기본적으로 설정되어 있는 모드로 액티비티가 호출될 때 마다 태스크에 저장하기 때문에 여러개가 중복으로 생성되고 저장될 수 있다.

  • activity1 > activity2(standard) > activity2(standard) 실행 시

    여기서 뒤로가기 버튼을 누르면 activity2화면이 보여짐

  1. singleTop
  • 액티비티가 이미 태스크의 가장 위에 있을 경우(현재 보이는 액티비티) onNewIntent() 메서드를 통해 기존 액티비티를 재활용한다. 따라서 액티비티가 다시 생성되어 중첩되지는 않는데 중첩만 되지 않을 뿐, 중간에 다른 Activity가 존재 할 경우 중복되어 생성될 수는 있다.

  • activity1 > activity2(singleTop) > activity2(singleTop) > activity1 > activity2(singleTop) 실행 시

  1. singleTask
  • 액티비티가 실행되는 시점에 새로운 태스크를 생성한다.
    (단, 새로운 태스크를 생성하려면 액티비티 호출 시 FLAG_ACTIVE_NEW_TASK 플래그나 manifest에 android:taskAffinity 속성을 주어야 한다.)
  • 이 액티비티가 호출하는 액티비티들은 새로 생성된 태스크에 쌓인다.
  • 이 액티비티가 다시 호출될 경우 onNewIntent()를 통해 재활용된다.
  • 예제
    1) activity1 > activity2(singleTask)

    2) activity1 > activity2(singleTask) > activity2(singleTask)

    3) activity1 > activity2(singleTask) > activity2(singleTask) > activity1

    4) activity1 > activity2(singleTask) > activity2(singleTask) > activity1 > activity2(singleTask)
  1. singleInstance
  • 액티비티가 실행되는 시점에 새로운 태스크를 생성한다.
    (singleTask와는 다르게 FLAG_ACTIVE_NEW_TASK 플래그나 android:taskAffinity 속성을 주지 않아도 새로운 태스크가 생성됨)
  • singleTask와는 다르게 해당 태스크에서 다른 액티비티를 허용하지 않는다. (다른 액티비티 호출 시 이전 태스크의 스택에 쌓임)
  • 예제
    1) activity1 > activity2(singleInstance)

    2) activity1 > activity2(singleInstance) > activity2(singleInstance)

    3) activity1 > activity2(singleInstance) > activity2(singleInstance) > activity1

    4) activity1 > activity2(singleInstance) > activity2(singleInstance) > activity1 > activity2(singleInstance)

인텐트 플래그에서 설정

  1. FLAG_ACTIVITY_NEW_TASK
    새로운 태스크를 생성해서 저장. singleTask와 동일.

  2. FLAG_ACTIVITY_SINGLE_TOP
    태스크 가장 위쪽의 액티비티일 경우 재활용. singleTop과 동일.

  3. FLAG_ACTIVITY_CLEAR_TOP
    액티비티가 태스크에 존재한다면, 그 액티비티 위쪽에 존재하는 모든 액티비티를 제거하고 해당 액티비티를 활성화

profile
오늘도 1보 걷기

0개의 댓글