[Android] 안드로이드 - 액티비티(Activity)와 액티비티 생명 주기(Activity Life Cycle)

2021. 12. 2. 16:19 구성/액티비티(Activity)

안드로이드에서 액티비티(Activity)는 애플리케이션의 컴포넌트(Componenet)를 의미합니다. 우리가 앱을 사용하면서 보는 화면이 액티비티를 의미하며 사용자와의 상호작용을 위한 UI를 올릴 수 있습니다. 액티비티는 일반적으로 화면을 가득 채우지만 작은 화면으로 만들어 다른 화면 위에 띄우는 것도 가능합니다. 

 

하나의 앱에는 보통 여러개의 액티비티가 존재합니다만, 보통 하나의 앱에서 하나의 액티비티가 Main으로 설정이 되어 앱을 처음 구동하였을 때 가장 먼저 화면에 표시되는 액티비티가 됩니다. 그러다가 사용자가 앱을 자유롭게 사용하면서 필요에 따라 다른 Sub 액티비티가 실행이 됩니다. 이때 Main 액티비티는 실행이 중단되지만 시스템은 해당 액티비티를 스택(Stack)에 Push를 하고 Sub 액티비티를 실행하게 됩니다. 

 

* 스택은 특정 데이터가 메모리에 쌓이는 형태를 가지는 구조입니다. 마치 박스에 물건을 쌓는 것과 비슷합니다. 박스에 물건을 하나씩 쌓고 박스로부터 물건을 꺼낼 때는 가장 나중에 들어간 물건이 먼저 나오고 가장 먼저 들어간 물건이 가장 나중에 꺼내집니다. 자료구조에서 스택(Stack)도 마찬가지입니다. 가장 먼저 들어간 (Push 된) 데이터가 가장 나중에 꺼내집니다.(pop) 이를 "후입 선출"이라고 부릅니다. 

 

 

Sub 액티비티가 실행되고 해당 화면에 포커스가 맞춰지는 경우에 Main 액티비티는 Stack에 Push가 됩니다. 이때 사용자가 Sub 액티비티에서 이전 버튼을 클릭하게 되면 Main 액티비티를 다시 Stack으로부터 Pop 되어 재개(resume)됩니다. 

 

Sub 액티비티가 실행되고 실행이 중단된 Main 액티비티의 상태 변화는 액티비티 생명주기 콜백 메소드에 의해서 알려지게 됩니다. 액티비티가 중단되는 경우만이 아니라 시스템은 액티비티의 다양한 상태 변화에 대해서 콜백 메서드를 통해 알려줍니다. 이는 아래에서 좀 더 살펴보도록 하겠습니다.

 

 


1. 액티비티 생명주기 함수 

액티비티의 생명주기 관련 함수를 구현하여 액티비티 생명주기를 관리하는 것은 유연한 어플리케이션을 개발하는 데 있어서 매우 중요한 역할을 담당합니다. 액티비티는 기본적으로 다음과 같은 세 가지 상태에 머무릅니다.

public class MainActivity extends AppCompatActivity {

    ArrayList<SampleData> movieDataList;

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

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

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

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

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

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

- onCreate() 함수

 

액티비티가 처음 생성될 때 호출되는 함수입니다. 처음 프로젝트를 생성하면 MainActivity에서 자동으로 생성해줄 만큼 액티비티 생명주기에 있어서 중요한 함수입니다. 해당 함수에서는 액티비티를 실행하기 위하여 정의된 사용자 UI를 올리기 위해 레이아웃 리소스 파일을 읽어와 객체를 생성하고 각종 초기화 작업을 진행하게 됩니다. 해당 함수 수 호출 후에는 항상 onStart() 함수가 같이 호출됩니다.

 

- onStart() 함수

 

액티비티가 사용자에게 표시되기 직전에 호출되는 함수입니다. 액티비티가 표시되면 onResume() 함수가 뒤따라 호출됩니다. 

 

- onResume() 함수

 

액티비티가 시작되고 사용자와 상호작용을 시작하기전에 호출되는 함수입니다. 이 시점에 액티비티는 스택의 가장 상위에 존재하고 있고 해당 함수 뒤에는 onPause() 함수가 뒤따라 호출됩니다.

 

- onPause() 함수

 

해당 액티비티에서 다른 액티비티로 전환되기 직전에 호출되는 함수입니다. 보통 해당 함수에서는 아직 저장되지 않은 데이터를 유지하기 위해 데이터를 저장하거나 시스템 자원을 소모하는 작업을 진행하는 경우 중단할 때 사용됩니다. 예를 들어 동영상을 재생하고 있었다가 다른 액티비티를 전환되는 경우 해당 함수에서 동영상을 멈추도록 하는 구현이 들어갈 수 있습니다. 해당 함수가 끝나기 전까지 액티비티 전환이 이루어지지 않기 때문에 해당 함수는 빠르게 작업이 이루어져야 합니다. 액티비티가 다시 표시되기 시작하면 (전환된 액티비티에서 이전 버튼 클릭) 다시 onResume() 함수가 호출되고 전환된 액티비티에 의해 액티비티가 가려지게 되면 onStop() 함수가 호출됩니다.

 

- onStop() 함수

 

액티비티가 사용자에게 표시되지 않을 때 호출됩니다. 해당 함수는 액티비티가 소멸되는 경우에 호출될수도 있고 또는 다른 액티비티로 전환되면서 호출되는 경우도 있습니다. 사용자에게 다시 표시되기 상호작용이 가능한 상태가 될 경우 onRestart() 함수가 호출됩니다. 

 

-onDestroy()

 

액티비가 소멸되기전에 호출되는 함수입니다. 시스템이 메모리 확보를 위해 인스턴스를 제거하는 경우가 있고 또는 finish() 함수를 호출한 경우에 호출되는 함수입니다.

 

▼ 액티비티가 중단되거나 일시정지 상태일 경우에 액티비티의 상태는 그대로 유지됩니다. 액티비티 객체가 일시 정지가 되더라도 메모리상에는 그대로 남아 있기 때문입니다. 즉 해당 액티비티가 다시 재개(Resume) 상태로 넘어가게 돼도 이전에 작업했던 정보를 그대로 가지고 있습니다. 다만 시스템이 메모리 복구를 위해 해당 액티비티를 소멸시키는 경우는 메모리상에서 액티비티 객체를 지워버리기 때문에 상태를 유지한 채로 액티비티를 재개할 수 없습니다. 즉 생명주기 단계에서 onCreate()를 시작으로 하여 액티비티를 새로 생성하게 됩니다.

 

출처 : https://lktprogrammer.tistory.com/164?category=741470