[컴][안드로이드] back button 의 동작

back button 누를 때 activity 동작, activity back stack 의 모습, back button (navigation key) 동작 원리 / task 와 back stack / back button 과 task 의 동작 / task 와 activity 의 관계 / activity stack


Activity State and Back Stack


이 back stack(application stack) 이 active state 와도 연관이 있다.


Activity 의 state 는 Activity stack 에서 Activity 의 위치에 달려 있다. 예를 들면 active state 는 stack 의 가장 위에 있는 녀석이 된다.(top of the stack)

Android memory manager 는 어떤 application 을 죽일지(free)에 대한 결정을 이 stack 을 보고 application 의 priority 를 결정한다.



--------

아래 내용은 Tasks and Back Stack[ref.1] 의 처음 부분을 번역한 것이에요. 나머지 부분은 나중에 ^^

Tasks and Back Stack - 1

Task 는 특정한 일을 하면서 유저와 사용한 activity 들을 모아놓은 것이다. 이 activity 들은 back stack 에 차례대로 넣어지게 된다.

홈에서 application 을 실행한다고 했을 때, 그 app 의 Main activity 가 열리게 되고, 이 녀석이 스택에서 root activity 가 된다.

지금의 activity 가 다른 activity를 실행시키게 되면, 새롭게 실행되는 activity 가 stack 에 top 에 오게 되고, focus 를 갖게 된다. 그리고 이전 activity 는 stack 에 동작을 멈춘 채로 남아있게 된다.

activity 가 멈추면, 시스템은 UI 의 현재 상태(current state)를 유지하게 된다.

back button 을 누르면 stack 에 가장 상위에 있는 activity 를 pop 해서 버리고 그 다음에 top 에 오는 녀석이 resume 된다. 당연히 이때 UI 의 이전상태를 같이 복구해 준다.

근데 이 stack 의 놓는 순서를 수정할 수 없다. 그렇기 때문에 이 녀석에 집어 넣을 때 순서를 잘 정해서 집어 넣어야 한다.

back button 을 계속해서 누르면 task 의 시작점까지 계속 해서 activity 를 stack 에서 꺼내서 버리게 된다. 이렇게 activity 를 모두 버리게 없애버리면 task 는 더 이상 존재하지 않는다. 다시 얘기하면, stack 에서 없앴다는 것은 windows 에서 생각하면 프로그램을 완전히 종료한 것으로 이해하면 될 듯 하다.

유저가 홈버튼을 누르거나 유저가 새로운 task 를 시작할 때 task 는 background 에서 동작할 수도 있는 녀석이다. background 에 있는 동안에 실행하고 있던 task 에 있는 모든 activity 들은 멈추게 되고, back stack 또한 그대로 남아있게 된다.

다른 task 가 실행되는 동안에 task 는 단순히 focus 만 잃게 된다. 그러다가 background task 가 끝나면 유저는 자신들이 쓰던 상태대로 foreground 로 돌아올 수 있게 된다.

이것은 폰에서 우리가 웹브라우저를 실행하면서 문자를 수신하는 경우 등을 생각하면 이해가 쉬울 듯 하다.

Task A 를 실행하던 중에 유저가 홈 버튼을 누르고 새로운 어플을 실행하면 task A는 background 로 넘어가고, 시스템은 그 어플을 위해 새로운 task(Task B 라하자.)를 실행한다. 이 Task B 는 자신만의 stack 을 가지고 있다.

유저가 task B 를 하고 나서 다시 홈 버튼을 누른 후에 Task A 를 시작하게 한 그 어플을 실행시키면, 백그라운드로 갔던 Task A 가 foreground 로 올라온다. Task A가 foreground 로 올라오면서 back stack 도 함께 복원되고, 가장 top 에 있는 stack 이 resume 되게 된다.

여러 task 를 동시에 사용하게 되면, 메모리 문제 때문에 시스템이 background activity 를 destroy 하기 시작한다. destroy 를 하게 되면 activity state 를 잃어버리게 된다. 하지만 이 경우에도 back stack 에서 activity 의 위치는 유효하다. back button 을 눌러서 state 를 잃어버린 activity 가 top 으로 오게 되면 system 은 이 activity 를 resume 하는 것이 아니라 recreate 하게 된다. 그러므로 현재 상태를 보존하고 싶다면 onSaveInstanceState() callback methods 를 구현해서 유지해야 한다.

back stack 을 재배치(rearrange) 가 되지 않기 때문에, 만약에 메일을 보다가 web browser activity를 호출하고, 홈으로 갔다가 web browser activity를 실행한다고 하면, 이 경우에 이전의 web browser activity 가 올라오는 것이 아니라, 각각의 web browser activity 가 생성되어 stack 에 쌓이게 된다.

References

  1. Tasks and Back Stack

댓글 없음:

댓글 쓰기