안드로이드 개발 Fragment 생명 주기는 어떻게 되는가?

안드로이드 개발

안드로이드 개발 Fragment 생명 주기는 어떻게 되는가?

 

환경: Android Studio 3.0

 

Activity Lifecycle 이 있듯이 Fragment 도 생명주기를 가지고 있습니다. 생명주기는 개발자가 알아야 할 가장 기본적이고 중요한 요소입니다. Fragment 를 컨트롤 하기 위해서는 생명주기를 제대로 알고 있어야 하기 때문입니다. Fragment 의 생명주기는 레이아웃에 추가거나 변경할 때 시작합니다. FragmentTransaction 로 추가(add) 변경(replace) 할 때를 말합니다.

 

생명주기를 한눈에 볼 수 있는 이미지는 다음과 같습니다. FragmentTransaction add 함수를 통해 onAttach() 를 시작으로 onDetach() 까지 과정입니다. 크게 두 부분으로 나누는데 시작하는 과정과 종료 과정입니다. 시작은 onAttach() ~ onResume() 이며, 종료는 onPause() ~ onDetach() 입니다.

안드로이드 개발 Fragment 생명 주기는 어떻게 되는가?

 

먼저 시작 과정에 함수들에 대한 설명을 하겠습니다.

l  onAttach() : Fragement Activity attach 할 때 호출, android.support.v4.app.Fragment 에서 deprecated 된 함수

l  onCreate() : 초기화 리소스들이 들어가는 곳

l  onCreateView() : Layout inflate 하는 곳, View 객체를 얻어서 초기화

l  onActivityCreated() : Fragment 생성 이후 호출 하는 함수

l  onStart() : Fragment 화면에 표시될 때 호출

l  onResume() : Fragment 화면에 로딩이 끝났을 때 호출 

안드로이드 개발 Fragment 생명 주기는 어떻게 되는가?

 

종료 과정의 함수에 대한 설명입니다.

l  onPause() : 화면이 중지되면 호출되는 함수

l  onStop() : Fragment 화면 삭제

l  onDestoryView() : View 리소스 해제

l  onDestory() : Fragment 완전히 종료할 때 호출

l  onDetach() : Fragment Activity 의 연결고리가 끊길 때 호출

 

다른 Fragment Add 하면서 기존 Fragment 가 종료되는 과정입니다.

l  onPause()

l  onStop()

l  onDestoryView()

 

Replace 함수나 backward Fragment 를 삭제하는 경우 실행되는 함수 입니다.

l  onDestory()

l  onDetach()

안드로이드 개발 Fragment 생명 주기는 어떻게 되는가?

 

 Main Activity 소스는 다음과 같습니다. getSupportFragmentManager() 함수로 FragmentManager 객체를 얻어 beginTransaction() 으로 fragment 추가를 시작합니다. 추가 함수는 replace() 입니다. 마지막에 commit() 을 해 주면 반영이 됩니다

import android.os.Bundle;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentTransaction;
import android.support.v7.app.AppCompatActivity;

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        FragmentManager fragmentManager = getSupportFragmentManager();
        FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
        fragmentTransaction.replace(R.id.contents,new OneFragement());
        fragmentTransaction.commit();
    }

} 

 Activity 화면을 구성하고 있는 xml 파일의 내용입니다. id contents <LinearLayout> Fragment 를 추가합니다.

 

activity_main.xml 

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context="gon.com.kakaomanager.MainActivity">

    <LinearLayout
        android:id="@+id/contents"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical">

    </LinearLayout>

</LinearLayout> 

 다음은 추가한 Fragment 클래스입니다. android.support.v4.app.Fragment 를 사용하고 있습니다.

import android.app.Activity;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;

public class OneFragement extends Fragment {

    String mId;

    public static OneFragement getInstance(String id) {
        OneFragement mFragement = new OneFragement();
        Bundle args = new Bundle();
        args.putString("id", id);
        mFragement.setArguments(args);
        return mFragement;
    }

    @Override
    public void onAttach(Activity activity) {
        Log.d(this.getClass().getSimpleName(), "onAttach()");
        super.onAttach(activity);
    }

    @Override
    public void onCreate(Bundle savedInstanceState) {
        Log.d(this.getClass().getSimpleName(), "onCreate()");

        super.onCreate(savedInstanceState);

        Bundle args = getArguments();
        if (args != null) {
            mId = args.getString("id", "");
        }
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        Log.d(this.getClass().getSimpleName(), "onCreateView()");
        return inflater.inflate(R.layout.fragment_contents, null);
    }

    @Override
    public void onViewCreated(View view, Bundle savedInstanceState) {
        Log.d(this.getClass().getSimpleName(), "onViewCreated()");
        super.onViewCreated(view, savedInstanceState);
    }

    @Override
    public void onActivityCreated(Bundle savedInstanceState) {
        Log.d(this.getClass().getSimpleName(), "onActivityCreated()");
        super.onActivityCreated(savedInstanceState);
    }

    @Override
    public void onStart() {
        Log.d(this.getClass().getSimpleName(), "onStart()");
        super.onStart();
    }

    @Override
    public void onResume() {
        Log.d(this.getClass().getSimpleName(), "onResume()");
        super.onResume();
    }

    @Override
    public void onPause() {
        Log.d(this.getClass().getSimpleName(), "onPause()");
        super.onPause();
    }

    @Override
    public void onStop() {
        Log.d(this.getClass().getSimpleName(), "onStop()");
        super.onStop();
    }

    @Override
    public void onDestroyView() {
        Log.d(this.getClass().getSimpleName(), "onDestroyView()");
        super.onDestroyView();
    }

    @Override
    public void onDestroy() {
        Log.d(this.getClass().getSimpleName(), "onDestroy()");
        super.onDestroy();
    }

    @Override
    public void onDetach() {
        Log.d(this.getClass().getSimpleName(), "onDetach()");
        super.onDetach();
    }

    @Override
    public void onSaveInstanceState(Bundle outState) {
        Log.d(this.getClass().getSimpleName(), "onSaveInstanceState()");
        super.onSaveInstanceState(outState);
    }
} 

 Fragment 를 구성하는 화면 레이아웃 입니다.

 

fragment_contents.xml 

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <TextView
        android:id="@+id/tv_title"
        android:text="Fragement 추가"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:gravity="center"/>

</LinearLayout>
Posted by 녹두장군