본문 바로가기
  • Jetpack 알아보기
Android/ʕ•ᴥ•ʔ

안드로이드 앱의 기본 구성 요소 (1) : Actvity와 수명주기

by 새우버거♬ 2021. 9. 6.

Activity는 안드로이드 앱 개발에 있어 필수적으로 알아야 할 구성요소입니다. 가장 큰 특징은 앱이 UI를 그리는 창을 제공한다는 것입니다. 우리가 보통 보는 앱의 화면은 Activity 이며, 대부분의 앱은 여러 화면을 제공하기 때문에 여러 개의 Activity로 구성되어 있다고 생각할 수 있습니다.

 

또한, Activity는 사용자가 상호작용을 하기 위한 진입점입니다. 이 다른 을 호출할 때, 전체를 호출하는 것이 아니라 다른 의 Activity를 호출하는 것이기 때문입니다. 이러한 동작은 manifest 파일에 Activity 및 관련된 속성을 선언하여 구성할 수 있습니다.


Manifest 구성

<activity>

Activity를 사용하기 위해서는 manifest 파일에서 <activity> 태그를 <application> 하위 요소로 추가해야 합니다. android:name 속성으로 해당 Activity 클래스를 필수적으로 선언해야 합니다. 또한, 아이콘, UI 테마와 같은 Activity 속성을 추가할 수 있습니다.

<intent-filter>

인텐트 필터는 명시적 요청과 암시적 요청을 기반으로 Activity를 실행하는 기능을 제공합니다. Intent를 이용해서 어떤 의 특정 Activity를 시작하도록 요청(명시적)할 수 있고, 시스템에게 특정 Action을 하는 Activity를 시작하도록 지시(암시적)할 수 있습니다.

<application ...>
    <activity android:name=".MainActivity"
    		  android:label="@string/main_label" ...>
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />
            <category android:name="android.intent.category.LAUNCHER"/>
        </intent-filter>	
    </activity>
    ...
</application>

Permission 선언

<activity> 태그 안에서는 android:permission 속성을 사용해서 Activity를 시작하는 앱을 제어할 수 있습니다. 상위 Activity와 하위 Activity 모두 각 manifest에 동일한 권한을 가지고 있어야 상위 Activity가 하위 Activity를 실행할 수 있습니다.

 

시작하려는 앱의 Activity에는 보유해야 하는 권한을 아래와 같이 정의해야 합니다.

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

Activity의 수명주기

Activity 클래스는 Activity의 상태 변화(생성, 중단 등)를 알 수 있는 콜백 메소드를 제공합니다. 사용자는 다른 으로 전환하여 현재 Activity를 벗어날 수 있습니다. 이때, Activity는 여전히 메모리 안에 남아 있으며 포그라운드로 다시 돌아올 수 있고, 종료한 지점에서 Activity가 다시 시작됩니다.

 

onCreate()

시스템이 Activity를 생성할 때 실행되는 콜백으로 필수적으로 구현해야 합니다. Activity의 필수 구성요소를 초기화합니다. 예를 들면 View를 초기화하거나 레이아웃를 inflate하는 작업을 진행합니다.

onStart()

onCreate()가 종료되고 Activity가 사용자에게 완전히 표시될 때 실행됩니다. 매우 빠르게 완료되고, 다음으로 시스템이 onResume() 콜백을 호출합니다.

onResume()

Actvity가 포그라운드에 표시될 때 호출됩니다. 어떤 이벤트가 발생하여 앱에서 포커스가 떠날 때까지 앱은 이 상태에 머무릅니다. 전화가 오거나, 다른 Activity로 전환하거나, 반투명 화면이 덮을 경우 이벤트가 해당됩니다.

 

이러한 포커스가 떠나는 이벤트가 발생하면 onPause() 콜백이 호출되고, 다시 Activity가 재개됨 상태로 돌아오면 시스템이 onResume() 콜백을 호출합니다.따라서 Activity가 재개되고 일시중지되는 상태에 따라서 구성요소, 데이터를 초기화하고 해제하는 작업을 수행해야 합니다.

onPause()

Activity가 포그라운드에 있지 않게 되었다는 것을 나타냅니다. Activity가 포커스되지 않은 상태는 다음과 같습니다.

 

1. 멀티 윈도우 모드에서 하나의 앱이 포커스를 가질 경우, 시스템은 그 외에 모든 다른 앱을 일시중지시킨다.

2. 구성 변경으로 인해 시스템이 일시적으로 Activity를 소멸시키는 경우

 

onPause() 콜백을 이용하여 시스템 리소스 또는 사용자가 필요로 하지 않을 때 배터리에 영향을 미칠 수 있는 모든 리소스를 해제할 수 있습니다. 멀티 윈도우 모드에서는 일시중지 상태의 Activity도 다른 윈도우에서 완전히 보일 수 있으므로 UI 관련 리소스와 작업을 해제하거나 조정할 때는 onStop()을 사용하는 것이 좋습니다. 

onStop()

Activity가 사용자에게 더 이상 표시되지 않을 경우, 중단됨 상태에 들어가고 시스템은 onStop() 콜백을 호출합니다. 새로 시작한 Activity가 현재 Activity 전체를 완전히 덮을 경우 해당됩니다.

 

onStop()에서는 앱이 사용자에게 보이지 않는 동안 필요하지 않은 리소스를 해제하거나 수정합니다. 예를 들면 애니메이션을 일시중지하거나, 데이터를 DB에 저장하는 동작을 수행할 수 있습니다.

onRestart()

Activity가 중단됨 상태였다가 다시 시작되면 시스템은 onRestart()를 호출합니다. 예를 들면 다른 Activity로 전환했다가 뒤로가기 버튼을 눌러 다시 이전 Activity가 보여질 때, 이전 Activity에서 onRestart()를 호출합니다.

onDestroy()

Activity가 소멸되기 전에 호출됩니다. 시스템은 다음 중 하나에 해당할 때 onDestroy()를 호출합니다. 

 

1. 완전히 Activity를 닫거나 finish()가 호출되어 종료되는 경우

2. 구성 변경으로 인해 시스템이 일시적으로 Activity를 소멸시키는 경우

 

이와 같은 두 가지 경우는 isFinishing() 메서드로 구분할 수 있습니다. onDestroy() 에서는 이전의 콜백에서 해제되지 않은 모든 리소스를 해제해야 합니다.


수명주기 예시

Activity A  생성 → 종료

[A Activity] onCreate() → onStart()  → onResume() onPause() → onStop() → onDestroy()  

Activity A → Activity B 이동

[A Activity] onPause()

[B Activity] onCreate() → onStart()  → onResume() 

[A Activity] onStop() (더 이상 화면에 표시되지 않는 경우)

 

+ 다시 뒤로가기를 통해 Activity A로 전환

[B Activity] onPause()

[A Activity] onRestart() → onStart()  → onResume() 

[B Activity] onStop() → onDestroy()

Activity A 가로화면으로 전환

[A Activity] onPause() → onStop()  → onDestroy() → onCreate() → onStart() → onResume()  


참고자료