본문 바로가기

안드로이드/팁

안드로이드 launch mode 선택

반응형

앱과 엑티비티의 특성에 맞지 않는 무분별한 launch mode 설정은 사용자들에게 불편함을 주기 때문에 주의해야 합니다. 

 

속성 

  • standard
  • singleTop
  • singleTask
  • singleInstance

standard

가장 일반적으로 많이 사용되는 속성이고 default값이다. 기존에 생성된 Task에 엑티비티를 계속 쌓고 버튼을 연속 두번 누를 경우 같은 엑티비티가 2개 이상 쌓일수 있다.  ( A > B > A > A )

 

singleTop

설정된 엑티티가 같은 Task 제일 상단에 존재할 경우 새로운 엑티비티를 생성하지 않고 기존에 생성된 엑티비티를 재 사용하며 onNewIntent 메서드를 호출한다.  ( B > C 상태에서 C 호출시 B > C > C 가 아닌 B > C 스텍 유지 )

※ C 엑티비티 launchmode SingleTop

 

사용예 

주로 사용자들이 많이 보고 있는 엑티비티이면서 푸시나, 공유하기 등을 통해 외부에서 접근이 가능한 엑티비티의 경우 singleTop 속성을 사용하면 onNewIntent를 통해 불필요한 호출을 줄일 수 있다.

 

singleTask

해당 속성을 가진 A 엑티비티는 동일 task상에서 하나만 존재한다. 동일 task에 존재할 경우 onNewIntent 메서드를 호출하는게 singleTop과 유사하지만 다른점은 제일 상단에 있지 않아도 재사용 되며 사이에 있는 엑티비티들은 모두 clear 시킨다. 

예 ) A > B  > A 를 차례로 호출하는 상황

1) A > B 호출

2) A > B > A 호출 ( 최초 생성된 A가 재활용되고 그 사이에 있던 B는 destroy된다. ) 

사용예 

현재 저희 서비스는 잠금화면을 사용하고 있고 이동할수 있는 엑티비티가 여러개 존재합니다. 그리고 디바이스 화면이 오프됐을때 잠금화면을 다시 호출해 사용자가 디바이스를 다시 켰을때 잠금화면이 노출하도록 합니다. 이때 잠금화면과 잠금화면에서 시작한 엑티비티들을 singletask로 하면, 다시 잠금화면을 호출했을때 사이에 있던 엑티비티를 따로 clear해주지 않아도 됩니다. 

 

그리고 주의할점으론 스플래시 엑티비티(휘발성 엑티비티)에는 singleTask를 사용하지 않아야 합니다. 앱이 백그라운드에 들어가 있을때 앱 아이콘 클릭으로 앱을 다시 실행 시키면 메인 화면이 떠있어도 스플래시 엑티비티부터 다시 시작하게 됩니다.

앱의 베이스가 되는 화면( ex: 메인엑티비티,홈화면)을 singleTask로 주셔야 앱 아이콘으로 다시 앱을 실행 시켰을때 기존 화면이 그대로 실행됩니다.

큰 오류가 발생하는 상황은 없겠지만 사용자가 앱 사용시 마지막으로 본 화면이 아닌 스플래시부터 보게되는 불편함을 가져다 줍니다. 

singleInstance

해당 속성으로 실행된 엑티비티는 단일 task에 존재하고 해당 테스트에 최상단으로 존재합니다. 엑티비티를 호출할때 생성되어 있는 엑티비티가 있다면 재활용해서 사용합니다. 

 

사용예 

초기 잠금화면을 포함한 잠금화면에서 시작하는 엑티비티들을 singleInstance로 띄웠는데, 그렇게하면 위에서 말한것 처럼 잠금화면을 다시 띄울때 기존에 띄워진 엑티비티들을 명시적으로 clear해줘야하는 이슈가 있어 유지보수성이 좋지 않습니다.

잠금화면엔 적절치 않고, 위젯을 설정해주는 엑티비티와 같이 앱과 무관하게 단일로 띄우는 화면들에 용이합니다.

 

주의할점으론 A > B( singleInstance ) 사용시 홈 버튼으로 백그라운드 진입 > 다시 앱 클릭 포그라운드로 B 화면이 보여지고 백버튼을 누르면 A 화면이 아닌 앱이 아예 꺼지므로 인앱의 화면들의 경우 스텍 관리에 신경써야 합니다.

하지만 예외도 존재합니다.

singleInstance 속성은 갖은 엑티비티를 실행할때 startActivityForresult로 실행하면 주의사항과 같이 작동하지 않고 동일 테스크처럼 작동합니다.

 

대략적으로 알고 사용했지만 무분별하게 사용된 singleInstance를 조정하는 과정에서 여러가지 알게된 내용을 적었습니다. 잘못된 내용이나 궁금하신 사항은 댓글로 남겨주시면 확인 즉시 답글 달도록 하겠습니다. 감사합니다.

반응형