유니티 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의 개념을 알아야 한다.
안드로이드 애플리케이션을 실행하는 독립적인 실행단위로 애플리케이션에 존재하는 모든 실행코드와 객체들을 포함한다.
어플리케이션이 실행되었는데 이미 해당 어플리케이션의 프로세스가 존재할 경우, 모든 구성요소는 동일한 프로세스 내에서 시작되고 동일한 스레드를 사용한다.
menifest에서 activity, service, receiver, provider 등은 android:process 속성으로 특정 프로세스에서 실행하거나 프로세스를 공유할 수 있다.
프로세스와는 무관하게 실행되는 액티비티의 정보를 저장하여 화면의 흐름을 관리한다.
프로세스는 애플리케이션의 모든 실행코드와 객체를 포함하지만 태스크는 애플리케이션이 실행되는 액티비티만을 관리한다. 또한 다른 프로세스의 액티비티를 참조할 수 도 있다.
앱이 실행되면, 프로세스와 태스크가 각각 생성된다. 프로세스1은 MainActivity 를 메모리 영역에 생성하고 태스크1은 MainActivity를 루트로 등록 할 것이다. 여기서 별도의 프로세스로 UnityAcitvity를 실행하면 프로세스2의 메모리 영역에 UnityActivity가 생성되고 태스크1은 UnityActivity를 참조하여 스택에 쌓아 둔다.
여기서 뒤로가기 버튼을 눌러 UnityActivity를 종료시키면 태스크는 UnitiyActivity를 스택에서 제거하고 그 밑에 있는 MainActivity 화면을 보여주게 될 것이다. 그리고 UnityActivity가 종료되어 프로세스2가 필요치 않으므로 프로세스2도 종료 될 것이다.
안드로이드는 자동으로 태스크를 관리하지만, 런치모드를 통해 태스크가 관리되는 방식을 설정할 수 있다.
기본적으로 설정되어 있는 모드로 액티비티가 호출될 때 마다 태스크에 저장하기 때문에 여러개가 중복으로 생성되고 저장될 수 있다.
activity1 > activity2(standard) > activity2(standard) 실행 시
여기서 뒤로가기 버튼을 누르면 activity2화면이 보여짐
액티비티가 이미 태스크의 가장 위에 있을 경우(현재 보이는 액티비티) onNewIntent() 메서드를 통해 기존 액티비티를 재활용한다. 따라서 액티비티가 다시 생성되어 중첩되지는 않는데 중첩만 되지 않을 뿐, 중간에 다른 Activity가 존재 할 경우 중복되어 생성될 수는 있다.
activity1 > activity2(singleTop) > activity2(singleTop) > activity1 > activity2(singleTop) 실행 시
FLAG_ACTIVITY_NEW_TASK
새로운 태스크를 생성해서 저장. singleTask와 동일.
FLAG_ACTIVITY_SINGLE_TOP
태스크 가장 위쪽의 액티비티일 경우 재활용. singleTop과 동일.
FLAG_ACTIVITY_CLEAR_TOP
액티비티가 태스크에 존재한다면, 그 액티비티 위쪽에 존재하는 모든 액티비티를 제거하고 해당 액티비티를 활성화