본문 바로가기

안드로이드스튜디오

안드로이드 스튜디오 프래그먼트 생명주기

728x90
반응형

* 프래그먼트 클래스를 정의할 때 XML 레이아웃의 내용을 인플레이션하는 코드가 들어 있는 메서드의 이름이 onCreatView이다.

이 이름은 액티비티의 onCreate와 비슷한 이름이다.

이 메서드는 onCreate 메서드처럼 어떤 상태가 되면 자동으로 호출되는 메서드이다.

 

* 프래그먼트는 액티비티를 본떠 만들면서 액티비티처럼 독립적으로 동작하도록 수명주기(Life Cycle) 메서드를 추가했다.

따라서 상태에 따라 API에서 미리 정해둔 콜백 함수가 호출되므로 그 안에 필요한 기능을 넣을 수 있다.

프래그먼트를 사용하는 목적 중의 하나가 분할된 화면들의 상태를 관리하는 것인데 이것을 가능하게 하는 것이 수명주기 메서드들이다.

즉, 액티비티 안에 들어 있는 프래그먼트도 필요할 때 화면에 보이거나 보이지 않게 되므로 액티비티처럼 각각의 상태가 관리되는 것이 필요하다.

 

* 프래그먼트는 액티비티 위에 올라가는 것이므로 프래그먼트의 수명주기도 액티비티의 수명주기에 종속적이지만 프래그먼트만 가질 수 있는 독립적인 상태 정보들이 더 추가되었다.

특히, 프래그먼트가 화면에 보이기 전이나 중지 상태가 되었을 때 액티비티처럼 onResume 메서드와 onPause 메서드가 호출되는데  프래그먼트는 액티비티에 종속되므로 이 상태 메서드 이외에도 세분화된 상태 메서드들이 더 있다.

 

* 수명주기 메서드들, 화면에 보이기 전에 호출되는 상태 메서드

메서드 설명
onAttach(Activity) 프래그먼트가 액티비티와 연결될 때 호출됨.
onCreate(Bundle) 프래그먼트가 초기화될 때 호출됨.
(new 연산자를 이용해 새로운 프래그먼트 객체를 만드는 시점이 아니라는 점에 주의해아 함)
onCreateView(LayoutInflator, ViewGroup, Bundle) 프래그먼트와 관련되는 뷰 계층을 만들어서 리턴함.
onAcitivityCreate(Bundle) 프래그먼트와 연결된 액티비티가 onCreate 메서드의 작업을 완료했을 때 호출됨.
onStart() 프래그먼트와 연결된 액티비티가 onStart되어 사용자에게 프래그먼트가 보일 때 호출됨.
onResume() 프래그먼트와 연결된 액티비티가 onResume되어 사용자와 상호작용할 수 있을 때 호출됨.

표에서 확인한 메서드들은 프래그먼트가 처음 만들어지고 화면에 나타나기 전에 호출되는 메서드들이다. 

액티비티가 메모리에 처음 만들어질 때는 onCreate 메서드가 호출된다. 

이와 마찬가지로 프래그먼트도 초기화될 때 onCreate 메서드가 호출된다.

그러나 한 가지 주의할 점이 있다.

프래그먼트는 액티비티 안에 추가되어 사용되면서 동시에 액티비티에 종속되어 있어 프래그먼트와 액티비티가 연결되어야 초기화 될 수 있다. 즉, 프래그먼트는 액티비티 위에 올라가야 제대로 동작한다.

이 때문에 new 연산자를 사용해 프래그먼트 객체를 만드는 시점과 onCreate 메서드가 호출되는 시점이 달라진다.

먼저 onAttach 메서드가 호출되며 액티비티에 프래그먼트가 추가되고 그 다음 onCreate 메서드가 호출된다.

즉, onAttach 메서드가 호출될 때 파라미터로 전달되는 액티비티 객체 위에 프래그먼트가 올라가 있게 된다.

그러므로 액티비티를 위해 설정해야 하는 정보들은 onAttach 메서드에서 처리해야 한다.

 

onCreateView 메서드는 프래그먼트와 관련되는 뷰들의 계층도를 구성하는 과정에서 호출된다.

액티비티가 메모리에 처음 만들어질 때는 액티비티의 onCreate 메서드가 호출되지만 프래그먼트의 경우에는 onActivityCreated 메서드가 호출된다. 이 메서드는 액티비티가 만들어지는 상태를 알 수 있도록 프래그먼트에서 다시 정의해 둔 onCreate 메서드와 구별해야 한다.

 

* 프래그먼트가 화면에 보이지 않게 되면서 호출되는 상태 메서드들

 

메서드 설명
onPause() 프래그먼트와 연결된 액티비티가 onPause되어 사용자와 상호작용을 중지할 때 호출됨.
onStop() 프래그먼트와 연결된 액티비티가 onStop되어 화면에서 더 이상 보이지 않을 때나 프래그먼트의 기능이 중지되었을 때 호출됨.
onDestroyView() 프래그먼트와 관련된 뷰 리소스를 해제할 수 있도록 호출됨.
onDestroy() 프래그먼트의 상태를 마지막으로 정리할 수 있도록 호출됨.
onDetach() 프래그먼트가 액티비티와 연결을 끊기 바로 전에 호출됨

onPause와 onStop 메서드는 액티비티의 onPause와 onStop 메서드가 호출될 때와 같은 상태 메서드이다.

onDestoryView 메서드는 프래그먼트 안에 들어 있는 뷰들의 리소스를 해제할 때 재정의하여 사용하며, onDetach 메서드는 onAttach와 반대로 프래그먼트가 액티비티와 연결을 끊기 바로 전에 호출된다.

onAttach와 onDetach 메서드가 수명주기의 시작과 끝이 되는 이유는 프래그먼트는 액티비티 위에 올라가지 않고서는 프래그먼트로서 동작하지 않기 때문이라는 점을 명심해야 한다.

그리고 프래그먼트가 new 연산자로 만들어졌더라도 액티비티 위에 올라가기 전까지는 프래그먼트로 동작하지 않는다는 점도 명심해야 한다.

 

MyFragment fragment = new MyFragment();
// 프래그먼트 객체는 만들어졌지만 프래그먼트로 동작하지는 않음.
getSupportFragmentManager().beginTransaction().add(fragment).commit();
// 액티비티에 추가된 후 프래그먼트로 동작함
반응형