Android Studio 공부 시작

[Ch3-9] 프래그먼트의 생명주기를 알아보자! (Life cycle of a fragment)

공급망관리 최선생 2019. 7. 29. 02:15

프래그먼트의 인생(생명주기가 옳은 말이다)에 관하여 알아보는 숙연한 시간을 갖자.... (내 인생도 돌이켜 볼겸...)

아니 근데 글쓴이 이 삼시세끼는 지난번에 액티비티의 생명주기 가르쳐줄 때에도

"나도 이게 왜 이게 중요한지를 몰라" 라고 하면서 그냥 공부하라고 난리피우네 라고 생각한다면, 내 글을 자세히 읽어준것에 대한 감사가 욕보다 먼저 나갈 것이다.

감사하다. 하지만 이제 대강 이유를 알겠다!!

그간에 다른 개발자 카카오방에서 엿들어본 결과, 액티비티와 프래그먼트의 생명주기가 중요한 이유는 하나의 어플리케이션은 보통 다수의 액티비티, 프래그먼트, 그 이외의 많은 기능들로 이루어져 있는데, 자신이 원하는 기능의 순서를 정밀하게 정의하기 위해 중요하다!

 

자! 액티비티의 생명주기와 마찬가지로, 프래그먼트의 생명 주기도 Debugging 을 하여 로그를 보면서 추적한다.

지난번에 생성했던 [Ch3-8] 에서 생성했던 프로젝트를 고대로 사용한다.

https://mckal-story.tistory.com/30 (참조)

 

[Ch3-8] Fragment 두번째! 가로형, 세로형 화면에 따라 동적으로 반응하는 프래그먼트 만들기 (Using dynamic Fragments depending on landscape/portrait mode)

지난번에 이어서 두 번째 프래그먼트 시간이다. 지난번 아주 유익한 시간을 갖었으니, 혹여나 첫 번째를 못 본 병아리는 지난번(Ch3-7) 꺼를 우선 보기 바란다. 지난번에는 activity_main.xml 에 프래그먼트 두개..

mckal-story.tistory.com

 

 

--------------------------------------------------

1. 우선 디버깅 할때 로그를 찍어내기 위해, Fragment1.java 파일에 다음과 같은 코드를 추가한다.

(길기만 하지 사실 별거 없으니, 그냥 복붙해서 사용해도 괜찮다.)

package com.example.fragment_dynamic;

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

public class Fragment1 extends Fragment {
    @Override
    public View onCreateView(LayoutInflater inflater,
                             ViewGroup container, Bundle savedInstanceState) {

        Log.d("Fragment1", "onCreaeView");

        // -- Inflate the layout for this fragment --
        return inflater.inflate(
                R.layout.fragment1, container, false);
    }

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

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        Log.d("Fragment1","onCreate");
    }

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

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

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

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

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

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

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

 

2. 해당 프로젝트를 디버깅 모드로 실행한다. (또는 Shift + F9)

2.1 그리고 화면을 가로모드(landscape)모드로 전환한다.

안드로이드 스튜디오 화면 전환 버튼

2.1 (continued) 또는 나같은 단축키 충들은 Ctrl + 키보드 화살표 우측 or 좌측

 

그리고 디버깅창에 찍히는 로그를 보자.

화면 가로모드로 전환시

프래그먼트 실행 시 생명주기

여기서, 좀 더 세분화 하여 본다면

1) onAttach 2) onCreate 3) onCreatedView 4) onActivityCreated 까지는 프래그먼트가 생성될때 거치는 생명주기이다.

1) onStart 2) onResume 은 프래그먼트가 디바이스 화면으로 보일때 거치는 생명주기이다.

 

홈버튼 클릭시

홈버튼 클릭 시 생명주기

1) onPause 2) onStop 발생

 

앱을 백그라운드에서 다시 불러왔을 때

 

포그라운드로 활성화 시킬때 생명주기

아까와 마찬가지로 화면이 가시적(visible)으로 변하면, onStart 와 onResume 의 생명주기가 발생한다.

 

백버튼으로 app을 종료(kill)했을 때

어플리케이션을 종료하였을 때 생명주기

 

 

아까 했던 이야기를 다시 해보자

<!--"그간에 다른 개발자 카카오방에서 엿들어본 결과, 액티비티와 프래그먼트의 생명주기가 중요한 이유는 하나의 어플리케이션은 보통 다수의 액티비티, 프래그먼트, 그 이외의 많은 기능들로 이루어져 있는데, 자신이 원하는 기능의 순서를 정밀하게 정의하기 위해 중요하다!" -->

라고 주장하였는데 예를 하나 들어보자.

프래그먼트가 종료됨과 동시에 그 다음에 자동으로 실행하고 싶은 작업이 있다라고 하면, 개발자는 그 작업을 onStop, onDestroyView, onDetach 어디에 둘지 그 기능에 따라 고심하여 선택할 수 있을것이다.

 

액티비티와의 가장 큰 차이!

1. 프래그먼트는 항상 액티비티안에 있어야 한다. 프래그먼트를 포함하고 있는 액티비티를 호스트 액티비티라고 한다. (주인님 ㅠㅠ)

2. 액티비티 내에서 어떠한 작업을 하다가 back 버튼을 누르면, 사용자가 했던 일련의 작업(transaction)을 자동으로 저장한다. 이를 back stack 에 자동으로 저장한다고 한다. 근데 우리 말썽쟁이 프래그먼트는 그딴거 없다. back stack 에 자동으로 transaction이 쌓이기를 원하면, "addToBackStack() 메서드를 사용하여 지정하여야 한다.