본문 바로가기

개발 코딩 정보 공유/안드로이드 자바 코틀린

안드로이드 프래그먼트 라이프 사이클(생명주기) 알고 쓰기~!!

 

 

 

 

안드로이드 플래그먼트 라이프사이클 입니다.

최근에는 플래그먼트를 지양하고자 하는 분들도 있지만 어쨋든 우리는 알아야 합니다. 플래그먼트 라이프 사이클은 액티비티와 다르게 조금 복잡합니다. 왜냐. 액티비티에서 시작되어 만들어진 객체이기 때문이죠.

액티비티에서 부터 순서대로 따라가다 보면 이해가 빠르실겁니다. 

그럼 최대한 단순하게 로그를 찍어서 확인 해보죠.

 

우선 액티비티 를 만들어줍시다.

 

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
package com.example.test.mynewapplication;
 
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentTransaction;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
 
public class FragmentLifecycleActivity extends AppCompatActivity {
    private Fragment mainFragment;
 
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_fragment_lifecycle);
 
        Log.i("ACTIVITY-TAG","===onCreate===");
 
        mainFragment = new BlankFragment();
        FragmentManager fm = getSupportFragmentManager();
        FragmentTransaction ft = fm.beginTransaction();
        ft.add(R.id.frame_layout, mainFragment);
        ft.commit();
 
    }
 
    @Override
    protected void onDestroy() {
        super.onDestroy();
 
        Log.i("ACTIVITY-TAG","===onDestroy===");
 
 
    }
}
cs

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".FragmentLifecycleActivity">
 
 
    <FrameLayout
        android:id="@+id/frame_layout"
        android:layout_width="match_parent"
        android:layout_height="match_parent"/>
 
</android.support.constraint.ConstraintLayout>
cs

 

 

 

그리고 플래그먼트를 만들어 줍니다. (당연 ㅡㅡ;;;)

 

 

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
package com.example.test.mynewapplication;
 
import android.content.Context;
import android.net.Uri;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentTransaction;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
 
 
public class BlankFragment extends Fragment {
 
    //***이거 건들이는 분들이 있는데... 플래그먼트는 생성자 빈 구조로 냅둬야 합니다.
    public BlankFragment() {
        // Required empty public constructor
    }
 
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        if (getArguments() != null) {
            //mParam1 = getArguments().getString(ARG_PARAM1);
            //mParam2 = getArguments().getString(ARG_PARAM2);
        }
 
        Log.i("FRAGMENT-TAG","===onCreate===");
    }
 
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        Log.i("FRAGMENT-TAG","===onCreateView===");
        // Inflate the layout for this fragment
        return inflater.inflate(R.layout.fragment_blank, container, false);
    }
 
 
    @Override
    public void onAttach(Context context) {
        super.onAttach(context);
 
        //여기서 재밌는부분이 있습니다.
        //바로 context 를 받을수 있는건데요.
        //attach 시점에 context 를 저장하고 나중에 활용할수 있겠죠?
        Context conxt = context;
        if(conxt instanceof FragmentLifecycleActivity){
            FragmentLifecycleActivity fragmentLifecycleActivity = (FragmentLifecycleActivity) conxt;
        }
        
        Log.i("FRAGMENT-TAG","===onAttach===");
 
    }
 
    @Override
    public void onResume() {
        super.onResume();
        Log.i("FRAGMENT-TAG","===onResume===");
    }
 
    @Override
    public void onStart() {
        super.onStart();
        Log.i("FRAGMENT-TAG","===onStart===");
    }
 
    @Override
    public void onPause() {
        super.onPause();
        Log.i("FRAGMENT-TAG","===onPause===");
    }
 
    @Override
    public void onStop() {
        super.onStop();
        Log.i("FRAGMENT-TAG","===onStop===");
    }
 
    @Override
    public void onDetach() {
        super.onDetach();
        Log.i("FRAGMENT-TAG","===onDetach===");
    }
 
}
cs

 

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
 
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout 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"
    tools:context=".BlankFragment">
 
    <!-- TODO: Update blank fragment layout -->
    <TextView
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:text="비어있는플래그먼트" />
 
</FrameLayout>
cs

 

 

 

 

자. 이제 실행해 봅시다. 

 

 

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
 I/ACTIVITY-TAG: ===onCreate===
 I/FRAGMENT-TAG: ===onAttach===
 ===onCreate===
 I/FRAGMENT-TAG: ===onCreateView===
 I/FRAGMENT-TAG: ===onStart===
 I/FRAGMENT-TAG: ===onResume===
 
 activity부터 시작되어 플래그먼트까지 잘왔네요.
 다시 나가보겠습니다.
 
 [백버튼을 눌러 나간다(종료)]
 
 I/FRAGMENT-TAG: ===onPause===
 I/FRAGMENT-TAG: ===onStop===
 I/FRAGMENT-TAG: ===onDetach===
 I/ACTIVITY-TAG: ===onDestroy===
cs

 

 

짠. 순서 보이시나요? 액티비티 처럼 단순하면 좋겠지만 프래그먼트는 액티비티와 라이프사이클이 이어져 있습니다. 잘 알고 써야 당황스러운 버그 들을 예방할수 있겠습니다.