HOME > android > basic

안드로이드 - Activity Lifecycle(생애주기) 알아보기

By JS | 20 Aug 2017

Activity Lifecycle

Activity Lifecycle이란 Activity가 생성되고 종료되기 까지의 상태(State)를 말합니다. Activity는 6개의 주요 Callback method를 제공해주는데 Activity의 상태가 변경될 때마다 각각의 Callback method를 호출해줍니다.

그림1은 Activity의 상태와 Callback method의 관계를 간단히 보여줍니다. activity lifecycle

Activity Callback

Callback method에 대해서 간단히 알아보겠습니다.

  1. onCreate() Activiy의 상태가 Created가 될 때 호출됩니다. Activity가 생성될 때를 의미합니다.

  2. onStart() Activiy의 상태가 Started가 될 때 호출됩니다. Activity가 화면에 보이기(visible) 시작할 때를 의미합니다.

  3. onResume() Activiy의 상태가 Resumed가 될 때 호출됩니다. 화면에 Activity가 보이는 상태로, 유저와 interaction 할 수 있는 상태입니다.

  4. onPause() Activiy의 상태가 Paused가 될 때 호출됩니다. 이 상태는 다른 Activity가 화면을 덮어서 일부분만 보이거나 투명한 화면이 그 위에 덮었을 때 등, 유저와 interaction 하기 어려운 상태입니다. 하지만 Paused 상태는 Resumed 상태로 다시 돌아갈 수도 있는 상태이기도 합니다. 이 상태에서 동작하지 말아야 할 것이 있다면 Callback method를 통해 멈출 수 있습니다. 또는 자원을 해제할 수 있습니다.

  5. onStop() Activiy의 상태가 Stopped가 될 때 호출됩니다. 이 상태는 Activity가 화면에 보이지 않는 상태입니다. Paused 상태와는 다르게 이 상태는 Resumed 상태로 돌아갈 수 없습니다. 하지만 Started 상태로는 돌아갈 수 있습니다. 이 때는 화면에 보이지 않기 때문에 필요없는 자원은 Callback method를 통해 해제시킬 수 있습니다.

  6. onDestroy() Activiy의 상태가 destroyed가 될 때 호출됩니다. 이 때는 Activity가 종료되었다는 의미이고 release되지 않은 모든 자원이 release됩니다.

Log로 Callback 확인

직접 Log를 넣고 Callback method가 호출되는지 확인해보세요. 이전 장에서 만든 Project에 이어서 하시면 됩니다.

MainActivity에 아래처럼 Log를 넣습니다.

package com.example.xyz.myapplication;

import android.content.Intent;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;

public class MainActivity extends AppCompatActivity {
    public static final String TAG = "MainActivity";

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

        Log.v(TAG, "onCreate(): activity가 생성되었습니다. View를 생성합니다.");
    }

    @Override
    protected void onStart() {
        super.onStart();

        Log.v(TAG, "onStart(): activity가 화면에 보이게(visible) 됩니다.");
    }

    @Override
    protected void onResume() {
        super.onResume();

        Log.v(TAG, "onResume(): 유저와 interaction할 수 있습니다.");
    }

    @Override
    protected void onPause() {
        super.onPause();

        Log.v(TAG, "onPause(): 유저와 interaction할 수 없습니다.");
    }

    @Override
    protected void onStop() {
        super.onStop();

        Log.v(TAG, "onStop(): activity가 더이상 화면에 보이지 않습니다.");
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();

        Log.v(TAG, "onDestroy(): activity가 종료되었습니다. 모든 자원을 release합니다.");
    }

    void onButtonClick(View v) {
        Intent intent = new Intent(this, SubActivity01.class);
        startActivity(intent);

        Log.d(TAG, "onButtonClick: SubActivity01을 실행시켰습니다.");
    }
}

직접 실행해서 로그를 확인해보세요.

앱을 실행시켜 MainActivity가 화면에 보일 때 아래 로그들이 나옵니다. Activity가 created >> started >> resumed 상태로 변경되었다는 것을 의미합니다.

08-15 11:14:14.591 7724-7724/com.example.xyz.myapplication V/MainActivity: onCreate(): activity가 생성되었습니다. View를 생성합니다.
08-15 11:14:14.591 7724-7724/com.example.xyz.myapplication V/MainActivity: onStart(): activity가 화면에 보이게(visible) 됩니다.
08-15 11:14:14.593 7724-7724/com.example.xyz.myapplication V/MainActivity: onResume(): 유저와 interaction할 수 있습니다.

Home 버튼을 눌러 Launcher 화면이 보이도록 해보세요.(Activity가 보이지 않게 만드세요) 로그를 확인해보면 resumed >> paused >> stopped 상태로 변경되었다는 것을 알 수 있습니다.

08-15 11:22:17.662 7724-7724/com.example.xyz.myapplication V/MainActivity: onPause(): 유저와 interaction할 수 없습니다.
08-15 11:22:17.790 7724-7724/com.example.xyz.myapplication V/MainActivity: onStop(): activity가 더이상 화면에 보이지 않습니다.

다시 앱을 실행시켜 보세요. Activity가 paused >> started >> resumed 상태로 변경된 것을 확인할 수 있습니다.

08-15 11:23:56.101 7724-7724/com.example.xyz.myapplication V/MainActivity: onStart(): activity가 화면에 보이게(visible) 됩니다.
08-15 11:23:56.101 7724-7724/com.example.xyz.myapplication V/MainActivity: onResume(): 유저와 interaction할 수 있습니다.

Activity의 상태가 변경될 때 그림1의 그래프처럼 단계적으로 변경됩니다. Callback method도 각 단계마다 모두 호출되는 것을 Log로 확인해보았습니다.

최종 상태가 paused 상태로 변경되는 케이스는 이 장에서 확인해보지 못했습니다. 앱의 일부분이 가려지거나 투명한 화면이 위에 덮히는 등의 경우가 일반적인 상황은 아닌데, 앞으로 개발하시면서 경험하실 수 있을 것 같습니다.

정리

Activity lifecycle에 대해서 알아보고 Activity가 제공해주는 Callback method에 대해서 알아보았습니다. 또한 Log를 넣어 실제로 callback method가 호출되는지 확인도 해보았습니다. Lifecycle에 대해서 더 자세한 내용을 알고 싶으시면 Activity lifecycle: Android API Guide을 참고바랍니다.

이 튜토리얼에서 사용한 코드는 GitHub: Activity lifecycle에서 확인하실 수 있습니다.

참고