본문 바로가기

안드로이드

안드로이드 생명주기 (LifeCycle) 정리 (JAVA)

안녕하세요 

이번에는 안드로이드 생명주기에 대한 글입니다. 

LifeCycle이라고도 불리는 생명주기입니다.

안드로이드를 공부하다보면 생명주기를 활용할 때가 있습니다.

 

 

 

안드로이드 생명주기에는 여러가지가 있습니다.

 

안드로이드 스튜디오에서 Log를 찍어서 생명주기가 언제 실행되는지 확인해 봅시다.

 

우선 간단하게 화면 구성을 해봅시다.

 

activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout 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"
    android:orientation="vertical"
    tools:context=".MainActivity">

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center"
        android:text="생명주기" />

    <Button
        android:id="@+id/btn_move"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="투명 화면 이동" />

</LinearLayout>

 

activity_sub.mxl

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout 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"
    android:gravity="center"
    android:orientation="vertical"
    tools:context=".Sub">

    <TextView
        android:id="@+id/textView"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:lines="10"
        android:text="투명 화면 글씨" />

    <Button
        android:id="@+id/button"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_gravity="center"
        android:gravity="center"
        android:text="서브버튼" />
</LinearLayout>

 

이후 자바 파일을 만들어줍니다.

 

MainActivity

package com.psw.lifecycle;

import androidx.appcompat.app.AppCompatActivity;

import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.view.Window;

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        requestWindowFeature(Window.FEATURE_NO_TITLE);
        setContentView(R.layout.activity_main);
        //액티비티 또는 프래그먼트가 생성이 되었을때
        Log.e("onCreate","ENTER");

        findViewById(R.id.btn_move).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                startActivity(new Intent(MainActivity.this,Sub.class));
            }
        });
    }

    @Override
    protected void onStart() {
        super.onStart();
        Log.e("onStart","ENTER");
    }

    @Override
    protected void onResume() {
        super.onResume();
        //중지 되어있던 액티비티가 다시 재개(재실행)되는 시점
        //투명한 화면일때 홈버튼을 누르고 다시 들어오면
        //onStart까지만 실행된다.
        //왜냐하면 Main기준으로 봤을떄 Main이 다시 실행되는 것이 아니기 때문이다.
        //투명한 화면이 다시 샐행되는 것이다.
        Log.e("onResume","ENTER");
    }

    @Override
    protected void onPause() {
        super.onPause();
        //중지 상태 (홈버튼을 눌러서 바깥으로 잠깐 빠져나갔을 때)
        //화면이 변경되는 순간(빛의 속도임)
        //다른 액티비티가 활성화 되어있을 떄
        //투명한 화면이 뜨게 되면 화면을 모두 가린것이 아니기 때문에 OnStop까지 가지 않는다.
        //투명한 화면(onPause)을 종료하면 onResume으로 돌아간다.
        Log.e("onPause","ENTER");
    }

    @Override
    protected void onStop() {
        super.onStop();
        //다른 액티비티가 현재 사용하고 있는 화면을 모두 가렸을때
        //홈버튼을 눌러서 바탕화면이 나왔을 때
        //onStop다음에는 onRestart가 실행된다.
        Log.e("onStop","ENTER");
    }

    @Override
    protected void onRestart() {
        super.onRestart();
        Log.e("onRestart","ENTER");
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        //화면이 파괴되어서 소멸했을 때 시점
        //앱을 완전히 끄기 직전
        Log.e("onDestroy","ENTER");
    }
}

 

sub는 onPause와 onStop의 차이점을 보기 위해 만들어줍니다.

sub.java

package com.psw.lifecycle;

import androidx.appcompat.app.AppCompatActivity;

import android.app.Activity;
import android.os.Bundle;

//Sub 반투명
public class Sub extends Activity {

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

 

AndroidManifest에 아래와 같이 작성해 줍니다.

투명하게 보이는 activity를 만드는 방법입니다.

 

<activity
            android:name=".Sub"
            android:exported="true"
            android:theme="@android:style/Theme.Translucent"/>

 

저는 Log.e를 사용합니다. 빨간색으로 나와서 더 집중이 잘되는 느낌이에요...ㅎㅎ

 

주석으로도 설명을 해놨으니 참고해주세요

 

처음 앱을 실행하면 onCreate, onStart, onResume 순으로 실행된 것을 확인할 수 있을 겁니다.

 

이 상태에서 홈버튼을 누르면 onPause, onStop 이 실행될 것입니다.

onPause는 사용자에게 화면의 일부분이 보이지 않은 상태가 되면 실행됩니다.

onStop은 사용자에게 화면이 100% 보이지 않은 상태가 되면 실행됩니다.

 

이후 다시 앱을 실행하면 onRestart, onStart, onResume의 순으로 다시 실행됩니다.

여기서 앱을 완전히 종료하게 된다면 onResume부터 onDestroy까지 실행될 것입니다.

 

onPause, onStop의 차이를 알아보기 위해 투명한 sub.java를 만들었습니다.

다시 앱을 실행시킨 후 투명 화면 이동 버튼을 눌러봅시다.

그럼 main화면과 sub화면이 동시에 보일 겁니다. 그리고 onPause까지만 실행이 된 것을 확인할 수 있죠

뒤로 가기를 누르면 다시 onResume이 실행됩니다. 

MainActivity기준으로 봤을때 sub화면이 실행됐지만 투명하기 때문에 MainActivity화면을 모두 가린 것이 아니기 때문에 onPause까지만 실행이 된 겁니다.

 

onPause, onStop은 사용자가 봤을 때 화면이 가려지면 실행되지만 약간의 차이가 있는 것을 확인할 수 있습니다.

 

이렇게 안드로이드 생명주기에 대해 알아보았습니다.

별거 아닌 거 같아도 생명주기를 꼭 사용해야 할 상황이 올 것이라고 생각합니다.

수고하셨습니다!

 

 

 

 

 

반응형