ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [안드로이드] Back Stack???
    Android📱 2022. 3. 28. 19:30

    Activity Stack, Back Stack

    한 가지 어플리케이션에는 여러 액티비티가 존재를 하게 된다.
    어플리케이션에서 창을 열거나 이동하면 그때마다 액티비티가 생성이 되는데 핸드폰의 화면은 한 개다.
    그러면 안 보이는 나머지 액티비티들은 어디에 있는 것일까?

    종료되나?

    그러면 뒤로 가기를 눌렀을 때 이전 액티비티가 나오지 않을 것이다.
    하지만 실제로 백버튼을 누르면 이전에 나왔던 액티비티가 차례대로 나오는 것을 알 수 있다.

    그 이유는 바로 Activity Stack이라고도 하고 Back Stack이라고도 하는 친구 때문이다.

    핸드폰에서 화면을 이동하거나 창을 띄우면 생성된 액티비티는 Back Stack에 차례대로 쌓이게 되고 뒤로가기를 누르면 차례로 사라지며 이전 액티비티가 보이게 되는 것이다.

    Stack?

    일단 Back Stack에서 Stack? 어디서 들어본 단어가 눈에 띈다. 아까 위에서 차례로 사라진다고 말했던 거처럼
    액티비티는 스택의 원리대로 관리가 된다.

    Stack은 후입선출!
    뒤에 들어온 게 먼저 나가는 구조를 갖고 있는 자료구조인데, 이 원리대로 액티비티가 Back Stack에서 관리가 되기 때문에 이전을 누르면 가장 늦게 열린 액티비티가 사라지고 이전 액티비티를 보여주게 되는 것이다.

    Task

    그렇다면 Back Stack은 단위가 있을까?
    실제로 사용자가 어플리케이션을 사용해서 Back Stack을 쌓다가 홈 버튼을 눌렀다가 다시 들어오면 OS에서 앱을 종료하지 않으면 다시 이용하던 화면이 뜨고 뒤로가기를 눌렀을 때 Back Stack이 그대로 쌓여있는 것을 확인할 수 있다.
    그것은 Task가 있기 때문이다.

    Task는 프로세스와 헷갈릴 수 있지만 둘은 다르다.
    Task는 해당 어플리케이션에서 사용된 Activity의 모음이라고 생각할 수 있다.
    만약 특정 기능을 통해서 다른 프로세스의 액티비티를 사용한다면 그 액티비티도 Task에 기록이 된다.

    그리고 백 그라운드로 Task가 넘어가게 되어도

    그림처럼 사라지는 게 아닌 백그라운드에서 Bask Stack을 유지할 수 있게 도와준다.
    그래서 사용자가 잠시 다른 활동을 하고 와도 하던 작업을 할 수 있게 도와줄 수 있는 것이다.

    Back Stack의 정렬

    Back Stack은 정렬이 되지 않는다.
    그래서

    그림처럼 하나의 액티비티가 또 인스턴스화 생기는 일이 있을 수 있다.
    그래서 Task관리를 통해서 이를 방지하고 조금 더 효율적으로 액티비티를 사용할 수 있게 된다.

    launchMode

    Task 관리는 안드로이드에서 자체적으로 관리를 해주지만 launchMode를 통해서 관리 방식을 설정할 수 있다.
    이는 Manifest나 Intent의 Flag로 관리를 할 수 있다.

    • Menifest
      • standard(기본)
        • 기본적으로 설정
        • 액티비티가 호출될 때마다 Task에 저장
        • 중첩 가능
      • singleTop
        • 동일 액티비티가 상위에 있으면 onNewIntent()를 통해서 기존 인텐트로 라우팅
        • 중첩은 안되지만 중복은 가능
      • singleTask
        • singleTask로 설정된 액티비티 실행 시 새로운 Task 생성하고 그 Task를 이용
        • 다시 호출되면 onNewIntent()로 해당 액티비티 재사용
      • singleInstance
        • 무조건 새로운 Task 생성
    • Intent Flag
      • FLAG_ACTIVITY_NEW_TASK
        • singleTask와 동일
      • FLAG_ACTIVITY_SINGLE_TOP
        • singleTop과 동일
      • FLAG_ACTIVITY_CLEAR_TOP
        • 액티비티가 태스크에 존재하면 위의 액티비티를 모두 제거하고 해당 액티비티 활성화
        • 매니페스트에서 standard로 설정된 액티비티가 이 플래그를 사용하면 위쪽 액티비티를 제거하고 자신도 제거되며 새로 생성
        • FLAG_ACTIVITY_NEW_TASK와 같이 사용할 경우 해당 액티비티를 재사용

    Menifest와 Intent Flag를 동시에 설정하면 우선순위가 올라간다.

Designed by Tistory.