[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로 띄울 수 있음.

댓글

이 블로그의 인기 게시물

[LED 전광판] 글자 애니매에션, 응원도구로 유용한 LED 형 어플이 오픈합니다.

C프로그래밍 OS에 따른 컴파일 환경 통합 makefile 만들기

[수평계] 간편 수평계 - 카메라 화면을 보면서 쉽게 수평 측정