ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [안드로이드 스튜디오] 액티비티 생명주기(Activity LifeCycle)
    안드로이드 2019. 12. 18. 13:00

     

    안드로이드에서 화면이 곧 Activity입니다.

     

    안드로이드 앱을 사용하다보면 여러가지 상황이 발생할 수 있습니다.

    사용자가 앱을 사용하다가 종료시킬 수도 있고, 앱을 사용하는 도중에 전화가 오게 될 수도 있습니다. 전화가 끊기면 다시 앱이 실행되는 것을 볼 수 있습니다.

     

    이렇듯 안드로이드에서 Activity의 상태를 알아차릴 수 있는 방법이 중요하게 됩니다. 이에 안드로이드의 Activity 클래스는 Activity의 상태가 변화하는지를 알아차릴 수 있는 여러 콜백 메서드를 제공합니다.

     

    [출처] https://developer.android.com/guide/components/activities/activity-lifecycle

     

    MainActivity.java 파일에 기본적으로 보이는 onCreate() 메서드도 이 콜백 메서드에 해당합니다.

    대표적으로 6가지의 콜백 메서드가 있습니다.

    onCreate(), onStart(), onResume(), onPause(), onStop(), onDestroy()

    각각 생성, 시작, 재게, 일시정지, 멈춤, 종료 되었을 때 호출되는 메서드를 말합니다.

     

    안드로이드 스튜디오에서 콜백 메서드를 추가해보도록 하겠습니다.

    MainActivity.java에서 콜백 메서드를 추가할 곳을 누르고 오른쪽 마우스를 클릭하여 Generate를 누릅니다.

     

    오버라이드 메서드를 클릭합니다.

    오버라이드는 부모 클래스에서 추상적으로 정의된 메서드를 자식 클래스에서 재정의하는 것을 의미하는 기능입니다.

     

    onStart를 검색하여 Enter를 치거나 OK를 눌러줍니다.

     

    콜백 메서드가 추가되는 것을 확인할 수 있습니다.

    나머지 6가지 콜백 메서드를 모두 찾아서 추가해줄 수 있습니다.

     

    다음은 콜백 메서드별 로그를 찍어보는 코드입니다.

    package com.example.example1;
    
            import androidx.appcompat.app.AppCompatActivity;
    
            import android.nfc.Tag;
            import android.os.Bundle;
            import android.util.Log;
    
    public class MainActivity extends AppCompatActivity {
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            Log.d("callBack", "onCreate");
        }
    
        @Override
        protected void onStart() {
            super.onStart();
            Log.d("callBack", "onStart");
        }
    
        @Override
        protected void onResume() {
            super.onResume();
            Log.d("callBack", "onResume");
        }
    
        @Override
        protected void onPause() {
            super.onPause();
            Log.d("callBack", "onPause");
        }
    
        @Override
        protected void onStop() {
            super.onStop();
            Log.d("callBack", "onStop");
        }
    
        @Override
        protected void onDestroy() {
            super.onDestroy();
            Log.d("Click", "onDestroy");
        }
    }

     

    앱을 실행하고 여러가지 백그라운드로 보내거나 해서 여러가지 동작들을 해보면

    검색을 통해 로그가 찍히는 것을 자세히 확인할 수 있습니다.

     

    각 콜백 메서드가 호출되는 시기를 간단히 정리하면

    • onCreate()는 액티비티가 처음 생성될 때 호출됩니다. 이 때 setContentView()를 통해 레이아웃 파일을 액티비티에 연결하는 작업이 이루어져야 합니다.
    • onRestart()는 액티비티가 정지된 후 다시 시작되기 직전에 호출됩니다.
    • onStart()는 액티비티가 완전히 표시되려 하기 직전에 호출됩니다. 이후에 onResume()이 이어서 호출됩니다.
    • onResume()은 액티비티가 유저와 상호 작용하기 직전에 호출됩니다. 이 함수가 호출되고 나면 유저는 앱을 정상적으로 사용할 수 있게 됩니다.
    • onPause() 다른 액티비티가 활성화되기 직전에 호출됩니다. 다른 액티비티가 활성화되면 유저는 앱을 사용하지 못하게 되는데 이 때 호출됩니다.
    • onStop() 액티비티가 완전히 표시되지 않게 되면 호출됩니다. 화면에 완전히 표시되지 않게 될 때 호출됩니다. 여기서 사용자가 다시 상호 작용하게 되면 onRestart()가 호출되고, 액티비티가 종료되면 onDestroy()가 호출됩니다.
    • onDestroy() 액티비티가 완전히 종료되기 직전에 호출됩니다. 

     

    여러 개의 액티비티를 갖는 앱에서도 액티비티 생명주기에 맞춰 콜백 메서드를 호출합니다.

     

    Activity A에서 Activity B를 표시할 때 콜백 메서드의 호출 순서는 다음과 같습니다.

    1. (Activity B를 표시하라는 명령이 떨어졌으므로) A의 onPuase() 호출
    2. B의 onCreate() 호출 (레이아웃 연결)
    3. B의 onStart() 호출 (화면 표시)
    4. B의 onResume() 호출 (이때부터 상호 작용 가능)
    5. (Activity A가 화면에 완전히 표시되지 않게 되었으므로) A의 onStop() 호출

    만약 액티비티 전환하는 도중에 안드로이드 시스템에 의해 이전 액티비티가 종료됐다면

    사용자가 이전 액티비티로 돌아가려 해도 onCreate() 메서드부터 호출되어 이전의 상태 정보가 모두 날아가게 됩니다.

     

    이런 것들을 방지하기 위해 onSavedInstanceState() 콜백 메서드를 통해 액티비티의 상태를 저장할 수 있습니다.

    저장된 데이터를 불러올 때는 onRestoreInstanceState() 콜백 메서드를 호출해주면 됩니다.

     

    액티비티 상태는 Bundle 객체를 이용해 저장합니다. Bundle은 키와 값으로 이뤄져있으며 키를 통해 원하는 상태를 찾아서 복원하는 원리입니다.

     

    다만 사용자가 back 버튼을 눌러서 액티비티를 종료하거나 소스 코드의 finish() 메서드로 종료하게 될 때에는 데이터의 저장 메서드는 호출되지 않습니다.

     

     

    이상 액티비티 생명주기에 대한 포스팅을 마칩니다.

Designed by Tistory.