앱은 하나의 프로세스 위에서 동작한다.
프로세스가 하나 실행되고 그 위에 가상 머신(Virtual Machine)이 만들어지고, 이 가상 머신 위에서 앱이 실행이 된다.
그러나 인텐트의 액션 데이터의 MIME타입으로 전화 앱을 실행시킬 수 있었다. 이 전화 앱 역시 다른 프로세스 위에서 실행하게 된다.
전화 앱에서 뒤로가기 버튼을 누르면 원래 앱으로 돌아올 수 있어야 하는데, 프로세스 끼리는 정보공유가 어렵다.
그래서 앱에서는 태스크(Task)가 만들어진다. 태스크는 앱이 어떻게 동작할지 결정할 때 사용된다.
태스크를 이용하면 프로세스처럼 독립적인 실행 단위와 상관없이 어떤 화면들이 같이 동작해야 하는지 흐름을 관리하는 것이 가능하다.
ex.) A 액티비티에서 B 액티비티(전화 앱)을 실행하면 태스크가 A->B를 가리키게 된다. 이 때 A 액티비티가 있는 프로세스와 B 액티비티가 있는 프로세스는 독립적일 수 있다.
프로세스와 태스크
하나의 프로세스에서 다른 프로세스의 화면을 띄우려면 시스템의 도움이 필요하다.
시스템에는 태스크라는 것이 존재하는데, 태스크는 액티비티의 각종 정보를 저장해둔다.
만일 개발자가 만든 앱에서 전화 앱의 화면을 띄우는 것이 아니라 전화 앱을 따로 실행시키면 전화 앱의 태스크는 따로 생성된다.
시스템에서 태스크를 자동으로 관리해 주지만, 따로 관리해야 할 경우도 생긴다. 이런 경우에는 AndroidManifest.xml에 액티비티를 등록할 때 태스크도 설정할 수 있다.
위와 같이 앱을 실행하면 메인 액티비티가 중첩해서 쌓이는 것을 확인할 수 있다.
이는 AndroidManifest.xml에서 MainActivity를 <activity> 태그에서 launchMode를 standard로 한 것과 같다.
이는 프로세스는 하나이지만, 태스크가 계속해서 새로 뜨는 화면을 차례대로 스택에 넣어서 관리하는 것이다.
이번에는 AndroidManifest.xml에서 <activity> 태그에서 launchMode 속성을 singeTop으로 설정해 보겠다.
이는 인텐트의 플래그에서 FLAG_ACTIVITY_SINGLE_TOP과 같은 효과를 나타낸다. 즉, 최상위 액티비티가 있다면 더 이상 액티비티를 생성하지 않겠다는 것이다.
AndroidManifest.xml 파일에서 launchMode를 추가했다.
이렇게 하면, 액티비티가 더이상 생성되지 않는 것을 확인할 수 있다.
이외에도 launchMode 속성에는
- singleTask : 해당 액티비티가 실행되면 태스크를 새로 만든다.
- singleInstance : 액티비티가 실행되는 시점에 새로운 태스크를 만들고 이후에 실행되는 액티비티들은 태스크를 공유하지 않는다.
경우에 따라 액티비티를 띄우며 태스크를 새로 만들도록 설정해야 할 수도 있다.
'안드로이드 > 개념' 카테고리의 다른 글
[Android] SharedPreferences 사용하기 (0) | 2021.07.31 |
---|---|
[Android] 액티비티의 생명주기 (0) | 2021.07.31 |
[Android] 플래그와 부가 데이터 - feat. Parcelable과 양방향 데이터 바인딩 사용 (0) | 2021.07.31 |
[Android] 인텐트, Intent (0) | 2021.07.31 |
[Android] 화면 여러개 만들어서 화면 전환하기 - onActivityResult, startActivityForResult Deprecated. registerForActivityResult 사용해보기 (0) | 2021.07.28 |