Notice
Recent Posts
Recent Comments
Link
«   2024/12   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
Tags
more
Archives
Today
Total
관리 메뉴

개발자이야기

android launchMode 본문

android

android launchMode

개발자가되고싶어 2021. 7. 13. 15:39
android launchMode

 

이번엔 android개발에 있어 꼭 제대로 이해하고 있어야 하는 launchMode에 대해 알아보겠습니다.

 

launchMode

  • standard

AndroidManifest 에서 launchMode 설정을 하지 않는다면 기본으로 설정되는 값입니다.

단순히 액티비티를 화면에 쌓아올립니다.

이런식으로 standard로 설정된 activity는 계속해서 쌓이게 됩니다.

 

  • singleTop

생성되는 인스턴스가 이미 현재 스택의 맨 위에 있다면 새 인스턴스를 생성하지 않고 onNewIntent() 메소드를 호출합니다.

standard와 다른점은 현재 1의 text를 출력 해 주는 activity가 최상단에 있을경우 똑같은 activity를 intent를 활용해 생성하여도 activity가 쌓이지 않는다는 것 입니다.

 

  • singleTask

시스템이 새 작업을 생성하고 새 작업의 루트에 있는 활동을 인스턴스화합니다. 그러나 활동의 인스턴스가 이미 별도의 작업에 있다면 시스템은 새 인스턴스를 생성하지 않고 onNewIntent() 메서드를 호출하여 인텐트를 기존 인스턴스로 라우팅합니다. 활동의 인스턴스가 한 번에 하나만 존재할 수 있습니다.

위의 내용은 공식문서에서 발췌한 내용입니다.

새 작업을 생성하고 새 작업의 루트에 있는 활동을 인스턴스화 한다?

무슨말인지 몰라 디버깅을 해보고 스택을 확인해보았습니다.. 그리고 다른 블로그에서 설명하길 새로운 스택이 만들어지고 새로운 스택에서 불러지는 activity들은 새로운 스택에 쌓인다고 합니다. 과연 진짜일까?

 

우선 아래의 가정을 한번 보겠습니다.

첫번째 가정

1번 activity launchMode = singleTask

2번 activity launchMode = standard

최초 실행 activity는 1번 activity 이고 intent를 활용하여 2번 activity를 생성했을때의 결과입니다.

위의 스택을 확인해보겠습니다. Stack #790이 현재 테스트 중인 안드로이드 스택입니다.

위에서 보시는바와 같이 1번 activity가 singleTask 이어도 스택은 하나입니다. 

Stack #1 Stack #3 Stack #4 는 무시합니다. 다른 시스템에서 사용하는 stack 인 것으로 보입니다.

 

두번째 가정

1번 activity launchMode = standard

2번 activity launchMode = singleTask

최초 실행 activity는 1번 activity 이고 intent를 활용하여 2번 activity를 생성했을때의 결과입니다.

보시는바와 같이 launchMode가 standard 인 1번 activity에서 singleTask 인 2번 액티비티를 intent로 생성하여도 스택은 하나입니다. (Stack #792)

 

자 이제 singleTask 는 하나의 스택에서 관리된다는 것을 확인했습니다. 

이제 액티비티를 순차적으로 호출 생성했을때 어떻게 되는지 확인 해 보겠습니다.

위와 같은 결과를 확인 할 수 있었습니다. 마치 intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP) 

를 사용한것 같은 효과를 확인할 수 있었습니다. 하지만 singleTask 는 일반적인 상황에서는 사용하지 말라고 권고합니다. 제가 확인한 문제점으로는

앱최초 실행시 실행 되는 1번 activity가 singleTask 일 경우 앱을 백그라운드 상태로 내리고 앱 아이콘으로 다시 앱을 실행하면 다른 activity 들은 clear 되고 1번 activity만 남는 문제점을 확인할 수 있었습니다.

 

 

  • singleInstance

"singleTask"와 동일하지만 시스템이 인스턴스를 보유한 작업으로는 어떤 다른 활동도 실행하지 않는다는 점이 다릅니다. 활동은 항상 자체 작업의 단 하나의 유일한 멤버입니다. 이 활동으로 시작된 모든 활동은 별도의 작업으로 열립니다.

위의 내용은 공식문서에서 발췌한 내용입니다.

무슨 내용인지 정확히 모르겠으니 또 디버깅으로 확인 해 봅시다.

 

첫번째 가정

1번 activity launchMode = standard

2번 activity launchMode = singleInstance

3번 activity launchMode = singleInstance

최초 실행 activity는 1번 activity 이고 intent를 활용하여 2번 activity를 생성하고 2번에서 3번 activity를 실행했을때의 결과입니다.

위의 stack에 보시는바와 같이 singleInstance 를 사용할 경우는 스택이 새로 생성된것을 확인 할 수 있습니다.

(Stack #799, Stack #800, Stack #801)

별도의 스택으로 관리되는 것 같군요.

 

두번째 가정

1번 activity launchMode = standard

2번 activity launchMode = singleInstance

3번 activity launchMode = standard

최초 실행 activity는 1번 activity 이고 intent를 활용하여 2번 activity를 생성하고 2번에서 3번 activity를 실행했을때의 결과입니다.

위와 같이 singleInstance 인 2번 액티비티에서 3번 액티비티를 호출하여도 같은 stack에 쌓이지 않습니다.

(Stack #816, Stack #817)

singleInstance 를 사용한 activity는 무조건 동립적인 공간의 stack에 혼자 쌓여 있다는것을 확인했습니다.

그림으로 표현하면 위와같이 쌓일것 입니다.

 

이상 android 의 launch 모드에 대해 알아보았습니다. 

 

위의 내용들은 전부 제가 직접 디버깅하여 확인한 내용이므로 틀릴 가능성이 있습니다. 

 

launceMode는 default값인 standard로 놓고 사용하는 경우도 많습니다. intent flag를 학습하기전 기본이 되어야 하는 내용이라 생각하여 포스팅 합니다.

 

읽어주셔서 감사합니다.

'android' 카테고리의 다른 글

android RecycledViewPool  (0) 2021.07.24
android intent bundle  (0) 2021.07.22
android 수명주기  (0) 2021.07.08
android Dagger  (0) 2021.06.09
mvvm + dagger  (0) 2021.06.07