안드로이드 생명주기

growdeveloper ㅣ 2021. 4. 9. 15:47

Goal

  • 수명주기 개념 이해하기
  • onCreate() 
  • onStart()
  • onResume()
  • onPause()
  • onStop()
  • onDestroy()

활동 수명 주기에 관한 이해

사용자가 앱을 탐색하고 앱에서 나가고, 앱으로 다시 돌아가면 앱의 Activity 인스턴스는 수명 주기 안에서 서로 다른 상태를 통해전환됩니다. Activity 클래스는 활동이 상태 변화(시스템이 활동을 생성, 중단 또는 다시 시작하거나, 활동이 있는 프로세서를 종료 하는 등)를 알아 차릴 수 있는 여러 콜백을 제공합니다.

 

사용자가 활동을 벗어났다가 다시 돌아 왔을 때 활동이 작동하는 방식을 수명 주기 콜백 메서드에서 선언할 수 있습니다.

  • 사용자가 앱을 사용하는 도중에 전화가 걸려오거나 다른 앱으로 전환할 때 비정상 종료되는 문제
  • 사용자가 앱을 활발하게 사용하지 않는 경우 귀중한 시스템 리소스가 소비되는 문제
  • 사용자가 앱에서 나갔다가 나중에 돌아왔을 때 사용자의 진행 상태가 저장되지 않는 문제
  • 화면이 가로 방향과 세로 방향 간에 회전할 경우, 비정상 종료되거나 사용자의 진행 상태가 저장되지 않는 문제.

활동 수명 주기 개념

활동 수명 주기 단계 간에 전환하기 위해 활동 클래스는 6가지 콜백으로 구성된 핵심 집합의 onCreate(), onStart(), onResume(), onPause(), onStop(), onDestroy() 를 제공합니다.

사용자가 활동을 벗어나기 시작하면 시스템은 활동을 해체할 메서드를 호출합니다. 어떤 경우에는 부분적으로만 해체하기도 합니다. 이때 활동이 여전히 메모리 안에 남아있으며(예:사용자가 다른 앱으로 전환할 경우) 포 그라운드로 다시 올아올 수 있습니다. 사용자가 해당활동으로 돌아오는 경우 사용자가 종료한 지점에서 활동이 다시 시작됩니다. 몇 가지 예외를 제외하고 앱은 백그라운드에서 실행될 때 행동을 실행할 수 없습니다. 시스템은 그 시점의 활동 상태에 따라 특정 프로세스와 그 안의 활동을 함께 종료할지 여부에 결정합니다. 활동 상태 및 메모리에서 제거는 활동 상태와 제거 취약성과의 관계에 관한 자세한 정보를 제공합니다. 활동의 복잡도에 따라, 모든 수명 주기 메서드를 구현할 필요가 없는 경우도 있습니다. 하지만 각각의 수명 주기 메서드를 이해하고, 사용자가 예상한 대로 앱이 동작하도록 필요한 수명 주기 메서드를 구현하는 것이 중요합니다. 

 

 

 

 

 

 

 

 

 


수명 주기 콜백

 

setContentView() 를 호출하는 등 일부 작업은 활동 수명 주기 메서드 그 자체에 속해 있습니다. 그러나 종속적인 구성요소의 작업을 구현하는 코드는 해당 구성요소 안에 넣어야 합니다. 이를 위해서는 종속적인 구성요소가 수명 주기를 인식하도록 해야 합니다.

import androidx.appcompat.app.AppCompatActivity;

import android.app.Activity;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        //onCreate함수 자체가 이미 수명주기 함수중 하나이다.
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        Log.d("onCreate","onCreate() 함수 호출 됨.");

        Button button = (Button)findViewById(R.id.button);
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                finish();
            }
        });
    }
    //어떤 상태들이 호출되는지 확인하기위한 함수들
    @Override
    protected void onStart() {
        super.onStart();
        Log.d("onStart","onStart() 함수 호출 됨.");
    }

    @Override
    protected void onStop() {
        super.onStop();
        Log.d("onStop","onStop() 함수 호출 됨.");
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        Log.d("onDestroy","onDestroy() 함수 호출 됨.");
    }

    @Override
    protected void onPause() {
        super.onPause();
        Log.d("onPause","onPause() 함수 호출 됨.");

        //가지고 있던 데이터값을 저장해두기.
        SharedPreferences pref = getSharedPreferences("pref", Activity.MODE_PRIVATE);
        //name은 저장할 때와 복구할 때 같은 이름으로 지정해주어야함

        SharedPreferences.Editor editor = pref.edit();
        editor.putString("name","난저장된 onPause() 함수야");
        //put으로 넣고 get으로 가져옴
        editor.commit();
        //commit을 꼭 해주어야 저장이 됨.

    }

    @Override
    protected void onResume() {
        super.onResume();
        Log.d("onResume","onResume() 함수 호출 됨.");

        //onPause일 때 저장해두었던 데이터를 복구해봅시다.
        SharedPreferences pref = getSharedPreferences("pref", Activity.MODE_PRIVATE);

        if(pref != null){
            String name = pref.getString("name","");
            //name값이 없는 경우에는 빈 값을 달라는 뜻
            Log.d("onResume","복구 된 이름 : "+name );
        }
    }
}

 

onCreate()

 

  • Activity가 생성되어 시작될 때 처음으로 호출되는 메서드(이 콜백은 시스템이 먼저 활동을 생성할 때 실행되는 것)
  • Activity의 리소스 초기화, 전체 수명 주기 동안 한 번만 발생해야 하는 기본 애플리케이션 시작 로직을 실행
  • 데이터를 목록에 바인딩하고, 활동을 ViewModel 과 연결하고, 일부 클래스 범위 변수를 인스턴스화 할수 있다.
  • 이 메서드는 savedInstanceState 매개변수를 수신하는데, 이는 활동의 이전 저장 상태가 포함된 Bundle 객체 입니다. 이번에 처음 생성된 활동인 경우 Bundle 객체의 값은 Null 입니다.
  • 활동은 생성됨 상태에 머무르지 않습니다. onCreate() 메서드가 실행을 완료하면 시작됨 상태가 되고, 시스템이 연달아 onStart() 와 onResume() 메서드를 호출합니다.

onStart()

  • 활동이 시작됨 상태에 들어가면 시스템은 이 콜백을 호출합니다.
  • onStart() 가 호출되면 활동이 사용자에게 표시되고 앱을 활동을 포그라운드에 보내 상호작용할 수 있도록 준비합니다.
  • 예를 들어 이 메서드에서 앱이 UI를 관리하는 코드를 초기화합니다.
  • 활동이 시작됨 상태로 전환하면 이 활동의 수명 주기와 연결된 모든 수명 주기 인식 구성요소는 ON_START 이벤트를 수신 합니다.
  • onStart() 메서드는 매우 빠르게 완료되고, 생성됨 상태와 마찬가지로 활동은 시작됨 상태에 머무르지 않습니다. 이 콜백이 완료되면 활동이 재개됨 상태에 들어가고 시스템이 onResume() 메서드를 호출합니다.

onResume()

  • 활동이 재개됨 상태에 들어가면 포그라운드에 표시되고 시스템이 onResume() 콜백을 호출합니다.
  • 이 상태에 들어갔을 때 앱이 사용자와 상호작용합니다. 어떤 이벤트가 발생하여 앱에서 포커스가 떠날 때 까지 앱이 이 상태에 머무릅니다.
  • 예를 들어 전화가 오거나 사용자가 다른 활동으로 이동하거나, 기기 화면이 꺼지는 이벤트가 이에 해당합니다.
  • 활동이 재개됨 상태로 전환되면 이 활동의 수명 주기와 연결된 모든 수명 주기 인식 구성요소는 ON_RESUME 이벤트를 수신합니다. 
  • 이 상태에서 수명 주기 구성요소가 포그라운드에서 사용자에게 보이는 동안 실행해야 하는 모든 기능을 활성화 할 수 있습니다.
  • 오디오 및 영상 등과 같이 화면 맨 앞에서 실행되고 있을 때만 필요한 리소스들을 설정하기 좋은 메소드.

onPause()

  • 시스템은 사용자가 활동을 떠나는 것을 나타내는 첫 번째 신호로 이 메서드를 호출합니다.
  • 활동이 포그라운드에 있지 않게 되었다는 것을 나타냅니다.
  • onResume() 와 한쌍이 되는 메소드입니다.
  • onPause() 메서드를 사용하여 시스템 리소스, 센서 핸들(예:GPS) 또는 활동이 일시중지 중이고 사용자가 필요로 하지 않을 때 배터리 수명에 영향을 미칠 수 있는 모든 리소스를 해제할 수도 있습니다.
  • 그러나 멀티 윈도우를 더욱 잘 지원하기 위해 UI관련 리소스와 작업을 완전히 해제 하거나 조정할 때는 onPause() 대신 onStop()을 사용하는 것이 좋습니다.
  • onResume() 메소드가 호출된 후 onPause() 메소드가 호출되기 까지를 포어그라운드 라이프사이클(Foreground Lifecycle) 이라고 부른다. onResume() 메소드에서 재생을 시작한 오디오나 영상 등을 중단해야 하고 DB와 같은 리소스들도 해제해야 함.

onStop()

  • 활동이 사용자에게 더이상 표시되지 않으면 중단됨 상태에 들어가고 시스템은 onStop() 콜백을 호출 합니다.
  • 활동이 중단됨 상태로 전환하면 이 활동이 수명 주기와 연결된 모든 수명 주기 인식 구성 요소가 화면에 보이지 않을 때 실행할 필요가 없는 기능을 모두 정지할 수 있습니다.
  • onStop() 메서드 에서느 앱이 사용자에게 보이지 않는 동안 앱은 필요하지 않은 리소스를 해재하거나 조정해야 합니다.
  • onPause() 대신 onStop()을 사용하면 사용자가 멀티 윈도우 모드에서 활동을 보고 있더라고 UI관련 작업이 계속 진행 됩니다.
  • onStop()을 사용하여 CPU를 비교적 많이 소모하는 종료 작업을 실행해야 합니다. 
  • 예를 들어 정보를 데이터베이스에 저장할 적절한 시기를 찾지 못했다면 onStop() 상태일 때 저장할 수 있습니다.
  • 활동이 중단됨 상태에 들어가면 Activity 객체는 메모리 안에 머무르게 됩니다. 이 객체가 모든 상태 및 멤버 정보를 관리하지만 창 관리자와 연결되어 있지는 않습니다. 활동이 다시 시작되면 이 정보를 다시 호출 합니다. 최상위 상태가 재개됨 상태인 콜백 메서드중에 생성된 구성요소는 다시 초기화할 필요가 없습니다. 또한 시스템은 레이아웃에 있는 각 View 객체의 현재 상태도 기록합니다. 활동이 정지됨 상태에서 다시 시작되어 사용자와 상호작용하거나, 실행을 종료하고 사라집니다. 활동이 다시 시작되면 시스템은 onRestart()를 호출 합니다. Activity가 실행을 종료하면 시스템은 onDestory() 를 호출합니다.

onDestroy()

  • onDestroy() 는 활동이 소멸되기 전에 호출됩니다.
  • 사용자가 활동을 완전히 닫거나 활동에서 finish()가 호출되어) 활동이 종료되는 경우
  • 구성 변경(예 : 기기 회전 또는 멀티 윈도우 모드)으로 인해 시스템이 일시적으로 활동을 소멸시키는 경우

활동이 소멸됨 상태로 전환하면 이 활동의 수명 주기와 연결된 모든 수명 주기 인식 구성요소는 ON_DESTORY 이벤트를 수신합니다. 여기서 수명 주기 구성요소는 활동이 소멸되기 전에 필요한 것을 정리할 수 있습니다.

 

활동에 소멸되는 이유를 결정하는 로직을 입력하는 대신 ViewModel 객체를 사용하여 활동의 관련 뷰 데이터를 포함해야 합니다. 활동이 구성 변경으로 인해 다시 생설될 경우 ViewModel은 그대로 보존되어 다음 활동 인스턴스에 전달되므로 추가 작업이 필요하지 않습니다. 활동이 다시 생성되지 않을 경우ViewModel은 onCleared() 메서드는 호출하여 소멸되지 전에 모든 데이터를 정리해야 합니다.

 

활동이 종료되는 경우 onDestroy()는 활동이 수신하는 마지막 수명 주기 콜백이 됩니다. 구성 변경으로 인해 onDestroy()가 호출되는 경우 시스템이 즉시 새 활동 인스턴스를 생성한 다음, 새로운 구성에서 그 새로운 인스턴스에 관해 onCreate()를 호출합니다.

 

참조한 사이트

developer.android.com/guide/components/activities/activity-lifecycle?hl=ko

 

활동 수명 주기에 관한 이해  |  Android 개발자  |  Android Developers

활동은 사용자가 전화 걸기, 사진 찍기, 이메일 보내기 또는 지도 보기와 같은 작업을 하기 위해 상호작용할 수 있는 화면을 제공하는 애플리케이션 구성요소입니다. 각 활동에는 사용자 인터페

developer.android.com

onepinetwopine.tistory.com/120

'안드로이드' 카테고리의 다른 글

RecyclerView로 동적 목록 만들기  (0) 2021.10.15
프래그먼트  (0) 2021.08.02
View 와 ViewGroup 이해하기  (0) 2021.06.04
Crashlytic  (0) 2021.04.16
Activity 상태 및 메모리에서 제거  (0) 2021.04.12