본문 바로가기
잡(job)기술

유보 프래그먼트

by 무니이구나 2016. 9. 27.

우리 딸래미를 위해서 동요를 재생해주는 안드로이드 프로그램을 하나 만들고 있다. 내가 첫번째로 계획해서 짜는 안드로이드 프로그램이라고나 해야 할까? 이코리아텍에서 안드로이드 강의 하나 후딱 듣고 뭔가 하나의 결과물은 내야 겠다고 생각했는데, 이것으로 선정했다.

채윤이가 누르는 걸 좋아하고, 장난감 사주러 갔을 때 누르면 소리 나오는 것을 좋아하는 걸 보고, 이것 하나 후딱 만들어봐야겠다고 생각했다. 그런데, 어라 그다지 쉽지가 않다. 강의 자체도 옛날 버전 기반으로 되어 있다보니 꽤나 다른 것이 많았다. 아무튼 우여곡절 끝에 List View 기반으로 프래그먼트가 연결되어 있는 activity 하나와 선택되었을 때 Media Player 와 함께 생성되면서 재생 및 상세 정보(?) 를 보여주는 앱을 하나 만들었다. 

지금 문제는 화면 전환 시에 발생한다. 화면을 가로에서 새로로 바꾸면 activity 가 새로 시작되면서 player도 종료되어 버리는 것이다. 문제는 쉽게 해결되었다. 프래그먼트로 만들다보니, 유보 프로그래먼트 설정을 해주면 간단히 원하는 동작을 구현할 수 있었다.

프래그먼트를 유보로 설정하면 자신의 뷰들은 다 소멸되어도 프래그먼트 자체는 소멸되지 않는다. 이는 FragmentManager 가 프래그먼트의 retainInstance 속성을 확인하여 처리하기 때문에 가능하다. 이 속성이 default 인 false 이면, 프래그먼트를 소멸시키고, true 이면 유보시켜뒀다가 새로운 FragmentManager가 생성되면서 연결되는 형태로 동작한다.

아래의 그림은 이 과정을 잘 나타내고 있는 그림이다. "실무에 바로 적용하는 안드로이드 프로그래밍" 이라는 책에서 가져왔다.


유보 프래그먼트로 설정이 되면 화면이 회전할 때 소멸이 되지 않고 유보상태가 되므로, 이에 따라서 불려지는 콜백함수도 달라진다. 유보 상태로 들어갈 때 onDestroy()는 호출되지 않고, onDetach() 함수만 호출되고, 다시 시작할 때는 onAttach() 만 호출되고, onCreate() 는 호출되지 않는다.

아래의 그림도 역시 같은 책에서 발췌한 것이다. 보통 Activity 의 생명 주기와 비교해서 유사하다라는 것을 보여줄 때 사용되는 그림인데, 여기에서는 유보 상태와 소멸 상태에서 호출되는 함수의 순서를 유심히 봐야할 것 같다.