ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Android] 태스크(Task)의 개념과 launchMode로 설정하기
    Android 2021. 4. 6. 12:47
    반응형

     

    태스트(Task)란?

    태스크는 어플리케이션에서 실행 되는 액티비티를 기록하는 스택이다.

    안드로이드에서는 태스크를 이용해서 화면의 순서와 흐름을 관리할 수 있다.

     

    사용자가 현재 화면으로 보고 있는 액티비티가 가장 위쪽에 위치하며,

    백(back)버튼을 누르면 보고 있던 액티비티는 스택에서 제거되고 그 아래에 있는 액티비티가 화면에 나타나게 된다.

    스택의 가장 아래 기본 액티비티(base activity)가 있고, 주로 홈화면이 들어가게 된다.

     

    프로세스 vs 태스크

    프로세스와 태스크는 혼동하기 쉽다.

    프로세스의 경우 다른 운영체제와 동일하게 어플리케이션의 독립적인 실행 단위를 말한다.

    태스크는 안드로이드에서 프로세스와 무관하게 실행되는 액티비티의 정보를 저장하고 있으며,

    태스크를 통해 어플리케이션의 화면의 흐름을 관리할 수 있다.

     

    따라서 프로세스는 해당 어플리케이션에 존재하는 모든 실행 코드와 객체들을 포함하지만, 태스크는 어플리케이션의 실행되는 액티비티만을 포함하며 다른 프로세스의 액티비티 또한 포함할 수 있다.

    여기서 헷갈렸던 것이 다른 프로세스의 액티비티를 포함할 수 있다는 것이였는데, 아래 그림을 보면 이해하기 쉽다.

    어플리케이션을 실행하게되면 프로세스와 태스크가 각각 실행된다.

    어플리케이션 1이 실행되어 Process #1과 Task를 생성했다고 하자.

     

    어떤 기능을 통해 별도의 어플리케이션 2를 실행하게 되면,

    어플리케이션 2의 프로세스가 실행되고 그 화면(Activity #2)에 대한 정보는 호출했던 어플리케이션 1의 태스크에 저장된다.

    즉, 액티비티의 인스턴스는 해당 앱 프로세스에의 메모리 영역에 생성되고, 호출하는 앱의 태스크에서 참조한다.

     

    이렇게 기능을 실행해서 activity #2를 열거나 back버튼을 눌러서 액티비티가 전환되면 현재 액티비티에 해당되는 프로세스로 전환된다.

    그리고 액티비티의 참조가 끝나고 태스크에서 모두 제거될 경우 프로세스도 종료된다.

    그림에서 어플리케이션 2의 액티비티인 Activity #2의 참조가 끝나고 태스크에서 모두 제거될 경우 Process #2도 종료된다.

     

    launchMode

    안드로이드 시스템은 자동으로 태스크를 관리하지만, 런치 모드를 통해 액티비티가 태스크에 관리되는 방식을 설정할 수 있다.

    런치모드는 AndroidManifest.xml이나 인텐트의 플래그를 통해 설정할 수 있다.

    매니페스트에서 설정하기

    설정할 수 있는 모드는 standard, singleTop, singleTask, singleInstance로 4가지가 존재한다.

    두가지로 분류할 수 있는데 standard와 singleTop은 액티비티가 여러번 인스턴스화 될 수 있고(singleTop의 경우 조건부), 태스크에 어떤 곳에도 존재할 수 있다.

    singleTask와 singleInstance는 단일 인스턴스를 유지하면서 항상 태스크의 루트에 있다.

     

    standard (기본 설정)

    기본적으로 설정되어 있는 모드로 액티비티가 호출될 때 마다 태스크에 저장하기 때문에 여러개가 중첩되서 저장될 수 있다.

     

    singleTop

    액티비티가 이미 태스크의 가장 위에 있을 경우(현재 보이는 액티비티일 경우) onNewIntent()메서드를 통해 기존의 인텐트로 라우팅한다.(액티비티 인스턴스를 재활용) 따라서 가장 위쪽의 액티비티가 다시 생성되지 않는다.

    연속되어 중첩되지는 않지만 태스크에 중복되어 저장될 수는 있다.

     

    singleTask

    singleTask로 설정된 액티비티가 실행되는 시점에 새로운 태스크를 생성한다. 이 액티비티가 호출하는 액티비티들은 새로 생성된 태스크에 쌓인다. 그리고 다시 호출될 경우 onNewIntent()를 통해 해당 액티비티를 재활용한다.

     

    singleInstance

    singleTask와 동일하게 새로운 태스크를 생성한다. singleTask와는 다르게 해당 태스크에서 다른 액티비티를 허용하지 않는다. (다른 액티비티 호출 불가)

     

     

    인텐트 플래그 이용하기

    인텐트에 플래그를 포함해서 태스크 관리 방식을 설정할 수 있는데, 매니페스트와 동시에 설정할 경우 플래그가 더 우선순위가 높다.

     

    FLAG_ACTIVITY_NEW_TASK

    새로운 태스크를 생성해서 저장. singleTask와 동일.

     

    FLAG_ACTIVITY_SINGLE_TOP

    태스크 가장 위쪽의 액티비티일 경우 재활용. singleTop과 동일.

     

    FLAG_ACTIVITY_CLEAR_TOP

    액티비티가 태스크에 존재한다면, 그 액티비티 위쪽에 존재하는 모든 액티비티를 제거하고 해당 액티비티를 활성화한다.

    * 매니페스트에서 standard로 설정된 액티비티가 이 플래그를 사용하면 위쪽 액티비티를 제거하고 자신도 제거되며 새로 생성한다.

    * FLAG_ACTIVITY_NEW_TASK와 같이 사용할 경우 해당 액티비티를 재사용할 수 있다.

    댓글