[Android] Android LaunchMode 및 기본 설정
<LaunchMode>
- standard (Default)
- singleTop
- singleTask
- singleInstance
<intent의 FLAG>
- FLAG_ACTIVITY_STANDARD ( default )
- FLAG_ACTIVITY_ SINGLE_TOP
- FLAG_ACTIVITY_ SINGLE_TASK
- FLAG_ACTIVITY_ SINGLE_INSTANCE
크게 나누어 보면 같은 Activity가 여러번 생성될 수 있냐 없냐에 따라 아래와 같이 나누어 진다.
1. 여러번 생성될 수 있다. ( standard 와 singleTop )
- 앱이 실행되는 동안 호출 되는 만큼 여러개가 생성되어 task의 stack에 쌓이게 된다.
- 즉 StartActivity() 함수를 통해서 호출될때마다 새로 생성되어 task의 stack에 쌓이게 되는 것이다.
- 예)
. startActivity(new Intent(this, TestActivity.class)); // 여기서 TestActivity는 launchMode가 standard
. 앱 실행후 이것을 10번 호출하면 TestActivity가 10개가 스택에 쌓이게 된다는 것이다.
- singleTop의 특징
. singleTop으로 설정된 Activity가 stack의 top에 위치해 있다면 새로 생성하지 않고
stack의 top에 있는 Activity를 재사용 하게 된다.
. 재사용 하게 되면 Activity의 onCreate()가 호출되는것이 아니라, onNewIntent() 가 호출
2. 딱 하나만 생성된다. ( singleTask 와 singleInstance )
- 일반적으로 구글에서 권장하지 않음
- singleTask와 singleInstance로 launchMode가 설정된 Activity 는 앱이 실행되는 동안 딱 하나만 생성된다.
- sigleTask은 다른 Activity들이 자신의 instance 위에 쌓일수 있게 하지만
- singleInstance는 다른 activity를 자신의 task안에 포함하지 않는다.
- sngleInstance로 설정된 activity에서 다른 activity를 launch 시키면
해당 task가 아닌 다른 task가 생성되어 그곳에 호출된 activity가 쌓이게 된다는 것이다.
<launchMode="singleTop">
- 메인이 Top에 있을 때에는 메인이 하나만 생성
- onNewIntent를 구현해야 함
- 메인이 한번 더 호출될 때에는 onCreate 대신 onNewIntent 호출 됨
- 생명주기는.. onPause() -> onNewIntent() -> onResume()
<alwaysRetainTaskState>
- 디폴트 값은 "false"이다.
- 사용자가 Task를 오랫동안(30분) 방치하면 시스템은 Root Activity를 제외한 모든 Activities의 Task를 Clear 시킨다.
- "true"로 설정 되어 있다면 Task는 오랜 시간이 지나도 Stack에 있는 모든 Activity를 유지한다.
- 본래 이 속성값은 ADB(Android Debug Bridge)를 통해서 앱 백업과 복구를 가능케 하는 설정이나
백업된 앱을 악용해 앱 내의 민감한 정보를 유출할 수 있다.
- 그러므로 모바일 앱 내에 민감한 정보를 저장해야 하는 경우 암호화 스토리지에 보관하는 방안 이외에도 ADB에 의한 백업을 허용하지 않아야 한다.
- 즉, ‘android:allowBackup’ 속성의 비활성(False) 적용을 해야 한다.
- System 에 의해서 task의 state를 관리받을지를 결정하는 attribute ( false : 시스템이 알아서, true : 관리 필요 없어! )
<clearTaskOnLaunch>
- 디폴트 값은 "false"이다.
- "true"로 설정되어 있으면 사용자가 Task를 떠났다가 다시 돌아 올 때마다 Stack은 Root Activity로 정리된다.
- Activity가 re-launch 될때, task에서 root activity 를 제외하고 위에 쌓인 모든 activity instance를 모두 제거한다. ( clear )
- 따라서 이 attribute 는 해당 activity가 task 의 root 를 차지하는 경우에만 유효
- "true" 값일 때 root activity 만 남기고, 이 속성은 root activity 를 실행 시킬 때만 작용을 합니다.
- 보통 re-launch 하면 마지막으로 보여지던 activity 가 그대로 보여짐
- android:launchMode="singleTop"와 함께 쓰면 유용할 듯~
- clearTaskOnLaunch = true 는 alwaysRetainTaskState = false 값에, 30분의 시간이 아닌 0초의 시간으로 설정된 것과 같은 효과
<allowBackup>
- 디폴트 값은 "true"이다.
- 보안 취약점이므로 true로 해서 자체 백업을 제공하는 것이 좋다.
- false로 했을 경우 데이터가 쉽게 탈취될 위험성 존재
<allowTaskReparenting>
- 디폴트 : false
- 새로 시작하는 activity 가 launch 시킨 task 가 아닌, 같은 affinity 를 가진 task 에서 launch 되도록 결정하는 값.
- launchMode 의 standard와 singleTop 에만 작용한다.
<taskAffinity>
- 디폴트 : 패키지명
- allowTaskReparenting 속성이나 FLAG_ACTIVITY_NEW_TASK 와 상호작용하여 activity 의 task 를 결정
- allowTaskReparenting="true"로 하면 내 APP 내에 있는 taskAffinity에 설정된 다른 Activity의 Task로 띄울 수 있음.
댓글
댓글 쓰기