본문 바로가기
Android 개발/Android

Activity Manifest 설정에 대한 정리(launchMode, screenOrientation, configChanges 등)

by Developer88 2020. 3. 10.
반응형

안드로이드는 Activity라는 독특한 구조를 가지고 있는데요.

이 Activity를 launch할 때의 환경값이나,

stack에 쌓이는 방법등을 정의할 수 있는 TAG가 있습니다.

오늘은 이것들에 대해서 정리해 보도록 할텐데요.

하지만, Manifest에 쓸 수 있는 attribute은 정말 많기 때문에,

그 중 project에 자주 사용할 만한 값들을 중심으로 정리해 보도록 하겠습니다.

 

1. screenOrientation

화면의 Orientation값을 설정해 줍니다.

보통 개발의 복잡도를 낮추기 위해서,

초기에는 아래와 같이 Portrait모드(세로 모드)를 많이 사용해 줍니다.

하지만, android studio3.6부터는 ignore태그를 아래와 같이 사용하지 않으면,

fullSensor 혹은 unspecified로 설정하라고 경고를 해 줍니다.

물론 강제사항은 아니므로, 아직까지는 이를 지킬 필요는 없습니다.

 

종종 사용되는 값들은 다음과 같습니다.

  • Portrait:  세로 모드로 유지
  • landscape:  Portrait과 반대되는 가로 모드로 유지
  • fullSensor:기기의 sensor에 따라서 방향이 결정되는 모드
  • unspecified:  설정하지 않으면 적용되는 default 값으로, system에 설정된 값에 따라 화면방향을 결정
  • reversePortrait 과 reverseLandscape: Portrait과 Landscape의 반대 방향으로 각각 설정 됨
  • sensorLandscape: 기기의 sensor에 따라서,Landscpe 혹은 reverseLandscpe모드로 설정
  • sensorPortrait: 기기의 sensor에 따라서, Portrait 혹은 reversePortrait 모드로 설정
  • Locked: 현재 유저의 rotation값을 그대로 유지

 

2. configChanges

원래 Activity는 환경값이 변화하면 종료되었다가 다시 시작되는 것이 기본값인데요.

여기에 나열되어진 값들에 대해서는 변경되어도, Activity를 종료시키지 않고,

onConfigurationChanged()함수만 호출하도록 할 수 있습니다.

 

여기에 사용할 수 있는 대표적인 값으로는,

orientation, screenSize, screenLayout 그리고 keyboard 등이 있습니다.

orientation, screenSize는 orientation과 그에 따른 screenSize 및 screenLayout이 변할 때에도,

종료되지 않도록 하는 것이구요.

keyboard는 외부 키보드등 키보드가 변경되어도 그에 따라 액티비티가 종료되거나 하는일이 없도록 하는 것 입니다.

 

 

 

3. LaunchMode

어떤 방식으로 액티비티가 시작할 지에 관한 것을 설정하기 위한 값 인데요.

standard, singleTop, singleTask, singleInstance 4가지 모드가 존재합니다.

이들은 Activity가 호출될 때, intent에 addFlags()의 인자값으로 들어온

Flag값들과 같이 동작하게 되는데요.

4가지 이기는 하지만 크게는 아래와 같이 두가지로 나누어 볼 수 있습니다.

standard와 singleTop은 여러번 객체화 될 수 있는 반면,

singleTask와 singleInstance에서는 한번만 객체화 되서 그것을 사용하도록 되어 있습니다.

 

3-1. standard 와 singleTop

standard와 singleTop은 startActivity가 시작될 때,

intent에 FLAG_ACTIVITY_NEW_TASK flag가 추가되지 않으면,

호출된 곳의 task에서 생성되게 됩니다.

 

singleTop의 특징은,

task내부에 Activity가 이미 존재할 경우,

새로운 Activity를 생성하지 않고,

기존의 Activity가 전달된 intent를 받아서 사용된다는 점 입니다.

standard의 경우는 이러한 제한 사항 없이 Intent를 받아서,

계속 새로운 객체가 생성되는 것 이구요.

 

다만 singleTop의 경우에도,

intent의 대상이 되는 task에 Activity가 존재하지 않으면,

새로운 객체는 생성될 수 있습니다.

 

 

3-2. singleTask와 singleInstance

위에서도 언급한 대로, 한 번만 객체화되서 사용할 수 있는데요.

또한 액티비티가 객체화 될 때, Task도 새롭게 시작되어서,

해당 Task의 root에 자리하게 됩니다.

 

singleInstance의 경우가 가장 까다로운 상태값이라고 할 수 있을 텐데요.

둘 다 새롭게 Task를 시작하여 root에 자리하지만,

singleTask가 다른 액티비티가 Task에 같이 존재하는 것을 허용하는 반면,

singleInstance는 해당 Task내부에 자신만 존재할 수 있도록 하는 것 입니다.

말 그대로, task내에 혼자 존재하는 singleInstance입니다.

따라서 singleInstance인 액티비티에서 startActivity를 할 경우,

다른 Task에서 Activity가 시작되게 됩니다.

 

4. noHistory

유저가 해당 액티비티를 벗어날 때, stack에서 제거하고 onFinish()를 호출할지의 여부를 선택해 줍니다.

default값은 false로 설정되어 있습니다.

true를 선택하면, finish되고 나서는 stack에 남아있지 않으므로,

유저가 back키를 눌러도 다시 해당 액티비티는 보이지 않습니다.

암호나 결제 진행에 관련된 Activity 혹은

실행된 Service와 bind여부에 따라 복잡한 구조를 가지는 Activity에

적용을 고민해 보면 좋을 것 같습니다.

 

 

5. clearTaskOnLaunch

Activity실행시에 task에서 root 액티비티를 제외한, 모든 액티비티를 제거할지에 관한 옵션입니다.

예를 들면,A액티비티의 clearTaskOnLaunch가 true로 설정되어 있다고 가정해 보겠습니다.

A액티비티에서 B액티비티가 실행 된 이후에,

유저가 Home버튼을 눌러서 다른 일을 하다가, 다시 B액티비티가 들어있는 task에 돌아와도,

A액티비티의 clearTaskOnLaunch값에 따라서 B액티비티는 finish되어서 A액티비티만 볼 수 있게 됩니다.

Task상에 위에 있는 다른 Activity들은 모두 제거되어 버리므로 조심해서 사용해야 하겠습니다.

설정하지 않을 경우의 기본 값은  false입니다.

 

6. excludeFromRecents

이 옵션을 true로 하면,

안드로이드의 OS버전별로 다르기는 하지만, 최근 앱들을 열거해서 보여주는 화면에서

해당 Activity가 보여지지 않도록 할 수 있습니다.

 

7. theme

해당 Activity의 테마를 설정해 줄 수 있습니다.

앱 전체의 테마와 다른 테마를 해당 Activity에 적용해야 할 때는,

개별 테마 값을 설정하는 방법이 효과적입니다.

아래 이미지와 같이, style을 따로 설정해 준 다음,

 

 

아래와 같이, 테마를 따로 적용해 주면 됩니다.

 

 

8. 정리

여기서 다룬 설정 이외에도 Manifest에서 설정할 수 있는 Activity의 값들은 많이 존재하는데요.

더욱 구체적인 내용은 아래의 공식문서를 참조해 주세요.

https://developer.android.com/guide/topics/manifest/activity-element#config

 

이 글과 관련하여 더 좋은 내용이 있을 경우,

여기서 업데이트 하도록 하겠습니다.

 

728x90

댓글