본문 바로가기
Android/Basic

Android Component : 1. Activity와 생명 주기

by jaesungLeee 2021. 8. 24.

Activity는 Android 어플리케이션의 중요한 구성 요소이다. Android 공식 문서를 살펴보면 흔히 말하는 Android 4대 컴포넌트를 자세히 설명하는데 이번 포스팅은 Android 4대 컴포넌트 중 하나인 Activity와 Activity의 생명주기 (Life Cycle)에 대한 설명이다.

 

1. Android Components : Activity

Android 공식 문서에서는 Activity를 아래와 같이 설명한다.

An activity is the entry point for interacting with the user. It represents a single screen with a user interface. For example, an email app might have one activity that shows a list of new emails, another activity to compose an email, and another activity for reading emails. Although the activities work together to form a cohesive user experience in the email app, each one is independent of the others. As such, a different app can start any one of these activities if the email app allows it. For example, a camera app can start the activity in the email app that composes new mail to allow the user to share a picture. 

[Reference : developers.android.com]

 

간단한 설명을 덧붙이자면, Activity는 User와 상호작용을 하기 위한 일종의 Entry Point 역할을 한다. 또한, Activity마다 UI를 포함한 화면을 갖게 된다. 즉, 우리가 특정한 서비스를 제공하는 어플리케이션을 만든다고 가정하면 어플리케이션의 화면마다 Activity를 생성한다는 것을 알 수 있다. 

 

Activity는 아래와 같은 추가적인 특징을 갖는다.

 

1. Activity 선언

: AndroidManifest.xml 에서 <application>태그의 하위 태그로 추가해야 한다.

(일반적으로 Activity를 생 성하면 자동으로 추가된다.)

<application>
    <activity android:name=".LoginActivity" />
    
    <activity android:name=".MainActivity" />
    ...
</application>

 

2. Intent Filter

: Intent는 컴포넌트에 특정한 Action, Data를 전달하는데 사용되는 메시지 객체이다. Intent Filter는 특정한 Intent를 수신할지 말지 정의하는 역할을 하며, 이러한 역할로 해당 컴포넌트의 특징이 정해진다.

(Intent에 대한 자세한 설명은 추 후 다른 포스팅에서 다룬다.)

 

<application>
    <activity android:name=".LoginActivity" />
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />
            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    
    <activity android:name=".MainActivity" />
    ...
</application>

위에 예시로 제시한 코드에서 <intent-filter> 태그를 살펴본다. Intent의 구성 요소중 action과 category라는 태그를 사용하여 어플리케이션이 최초 실행될 때 시작 액티비티를 정의한다. 다시 말해, 어플리케이션이 실행되면 LoginActivity부터 시작될 것이다. 

 

3. Permission 선언

동일하게 AndroidManifest.xml의 <activity>태그 안에서 특정 Activity를 실행할 수 있는 어플리케이션을 제어할 수 있다. 또한, 자식 Activity에서 어떤 특정한 권한을 가지고 실행을 한다면 동일하게 부모 Activity에도 동일한 권한이 선언되어 있어야 한다.

Android 공식 문서에서 설명하는 예시를 살펴본다.

 

<manifest>
    <activity android:name="..."
        android:permission="com.google.socialapp.permission.SHARE_POST" />
</manifest>

위와 같이 SocialApp이라는 어플리케이션을 이용하여 소셜 미디어의 게시물을 공유하기 위해서는 게시물을 호출하는 어플리케이션이 보유해야 하는 특정 권한을 정의해야 한다.

 

<manifest>
    <uses-permission android:name="com.google.socialapp.permission.SHARE_POST" />
    ...
</manifest>

위와 같이 어플리케이션의 권한이 SocialApp의 Manifest파일에서 정의한 권한과 일치해야 SocialApp을 호출하여 소셜 미디어의 게시물을 공유할 수 있게 된다.

 


2. Activity Life Cycle (액티비티 생명 주기)

Activity는 Activity가 활동하는 전체 기간에 걸쳐서 여러 상태를 거친다. 또한, 이러한 상태들 간의 전환을 처리하는 데는 Callback Method를 사용할 수 있다. 아래에 그 Callback Method들을 설명한다.

 

Android 공식 문서에서는 이해의 편의를 위해 다이어그램을 제시하고 있다.

출처 : developers.android.com

 

위의 다이어그램에서 보는 것 과 같이 Activity의 생명 주기 단계 간 전환을 위해 총 6가지 Callback Method를 사용한다. Activity가 새로운 상태에 들어가게 되면 시스템은 각각의 Callback Method를 호출하게 된다.

상태 변화라 함은 디바이스의 화면이 꺼지거나, 어플리케이션이 종료될 때와 같은 상황을 의미한다.

 

아래는 Activity 생명 주기 Callback Method들의 간단한 설명을 표로 제시한다.

Android 공식 문서에서 설명하는 Callback Method들의 키워드 들을 정리해 보았다. 추가로 onRestart( )라는 Callback Method는 onPause( ) 상태의 Activity가 다시 시작(Restart)되려 할 때 호출된다.

 

아래에 각 Callback Method들을 자세하게 설명한다.

 

2-1. onCreate( )

onCreate( )는 시스템이 Activity를 처음 생성할 때 실행된다. 이 Method에서는 Activity의 구성 요소들을 초기화하는 과정이 포함되어야 한다. 또한, onCreate( )에서 View를 생성하고 setContentView( )를 호출하여 Activity의 UI를 위한 레이아웃이 정의되어야 한다. activity_main.xml이 setContentView( )에 정의된 것을 볼 수 있었을 것이다.

onCreate( )가 완료되면 그 다음 Callback으로 onStart( )를 호출한다.

 

2-2. onStart( )

onCreate( )가 완료되면 Activity는 "실행"상태로 전환되고 onStart( )를 통해 Activity의 UI가 사용자에게 보이게 된다. 이 상태에서는 Activity가 Forground로 나오게 된다.

어플리케이션이 중단되었다가 다시 실행되는 경우에는 onRestart( ) 다음에 호출되는 Callback Method 이기도 하다.

 

2-3. onResume( )

Activity가 사용자와의 Interaction 전에 호출되는 Callback Method이다. 이 상태에서 Activity는 스택 상 가장 위에 존재하게 되고, 사용자의 액션을 캡처하여 수행한다. 예를 들어, 사용자가 메시지를 입력하거나 버튼을 클릭하는 이벤트가 발생하면 onResume( )에서 처리하게 되고, 대부분의 핵심 기능들은 onResume( )에 구현하게 된다.

onResume( )이 완료되면 그다음 Callback으로 onPause( )를 호출한다.

 

2-4. onPause( )

사용자가 A라는 Activity에서 버튼을 클릭하여 B라는 Activity로 전환하려 한다고 가정하자. 이 때, Activity A는 "일시중지" 상태로 전환되고, 포커스를 잃었다고 표현한다. 이때 호출되는 Callback Method가 onPause( )이다.

하지만, onPause( )는 사용자가 일시적으로 해당 Activity를 떠나 다른 Activity를 사용하려 하고 있으며 언제든지 "중지" 혹은 "활동 재개" 상태로 전환될 수 있음을 나타낸다. 따라서, 다른 Activity를 사용하다가 다시 기존 Activity로 돌아오게 되면 onResume( ) Callback Method가 호출될 것이다.

예를 들어, 미디어 플레이어에서 음악을 재생하는 경우에는 Activity가 "일시중지" 상태여도 지속적으로 음악이 재생되고 UI가 업데이트 되어야 하므로 onPause( )를 사용한다.

onPause( )가 완료되면 "일시중지" 상태로 전환한 후 이 후 발생하는 상황에 따라 onStop( ) 또는 onResume( ) Callback을 호출한다.

 

2-5. onStop( )

onStop( )은 Activity가 더 이상 사용자에게 표시되지 않는 경우 달리 말해, 다른 Activity가 보이는 (포커스를 잃은) 경우에 호출되는 Callback Method이다. onStop( ) 호출 이후, 사용자가 다른 Activity를 사용하다 다시 기존 Activity로 돌아오게 되면 onRestart( )가 호출될 것이다. 또, 아예 Activity가 종료가 된다면 onDestroy( )가 호출될 것이다.

 

2-6. onDestroy( )

onDestroy( )은 Activity가 제거될 때 호출되는 Callback Method 이다. 예를 들어, 사용자가 뒤로 가기 버튼 (onBackPressed( )를 호출할 때)을 누르거나, 시스템의 직접적인 이유 (Memory 부족)의 경우 onDestroy( )가 호출된다. 또한, 일반적으로 Activity 혹은 Activity가 포함된 프로세스가 제거될 때 Activity의 모든 Resource를 해제하도록 구현해야 한다.

추가로, 뒤로가기 버튼을 누르는 이벤트 발생 시 onPause( ) -> onStop( ) -> onDestroy( ) 과정을 거치게 된다.

 


3. 상황 별 Activity Callback Method 절차

마지막으로, Activity의 상황에 따른 Callback Method의 절차를 살펴본다.

 

3-1. Activity가 시작되는 과정

Activity가 시작되면 onCreate( ) -> onStart( ) -> onResume( ) 순서로 호출된다.

onCreate( )에서 Activity 구성 요소들을 로딩하고, onStart( ), onResume( )에서 구성요소를 화면 상에 보이고 사용자와의 Interaction을 수행한다.

 

3-2. Activity가 종료되는 과정

Activity가 종료되면 onPause( ) -> onStop( ) -> onDestroy( ) 순서로 호출된다.

onPause( )와 onStop( )은 뒤로 가기 버튼 클릭 혹은 finish( )를 호출할 때 실행되고, onDestroy( )은 최종적으로 Activity가 메모리 상에서 삭제된다.

 

3-3. Activity가 다시 시작되는 과정

Activity가 Background에 상주하는 경우 onPause( ), onStop( )까지만 호출되고 대기한다. 이후 Activity가 다시 시작되는 경우 onRestart( ), onStart( ), onResume( )까지 호출된다.

 

3-4. 강제 종료 후 다시 실행되는 과정

메모리 부족과 같은 특별한 상황에서 어플리케이션이 강제 종료된 후 다시 실행될 때에는 onCreate( )부터 다시 호출된다.

 


 

References

https://developer.android.com/guide/components/activities/intro-activities

 

활동 소개  |  Android 개발자  |  Android Developers

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

developer.android.com

https://blog.naver.com/PostView.naver?blogId=lth9036&logNo=221572320853&redirect=Dlog&widgetTypeCall=true&topReferer=https%3A%2F%2Fbbaktaeho-95.tistory.com%2F62&directAccess=false 

 

안드로이드(Android) 액티비티 생명주기

액티비티 시작) · 액티비티 시작 부분으로 액티비티가 시작되면 onCreate() 호출 후 onStart() 호출, on...

blog.naver.com

https://velog.io/@eun3673/application-fundamentals-lifecycle

 

안드로이드 4대 컴포넌트 생명주기

안드로이드 4대 컴포넌트의 생명주기에 대해 알아봅니다.

velog.io

 

'Android > Basic' 카테고리의 다른 글

Android Component : 2. Service 개요  (0) 2021.11.08
Permissions  (0) 2021.09.04
Context  (1) 2021.08.26