[Android(Java)] Activity와 Fragment의 이해
카테고리: Android(Java)
1. Activity
안드로이드 Activity는 화면에 표시되는 UI 구성을 위해 가장 기본이 되는 요소이다. 안드로이드 앱은 화면에 UI를 표시하기 위해 최소 하나의 Activity를 가져야 하며, 앱 실행 시 지정된 Activity를 실행하여 사용자에게 UI를 표시하게 된다.
main() 메서드를 사용하여 앱을 실행하는 프로그래밍 패러다임과 달리 Android 시스템은 생명 주기의 단계에 해당하는 특정 콜백 메서드를 호출하여 Activity 인스턴스의 코드를 시작한다.
다음은 Activity의 계층 구조이다.
java.lang.Object
└ android.content.Context
└ android.content.ContextWrapper
└ android.view.ContextThemeWrapper
└android.app.Activity
대충 Activity의 상위에 이런 것들이 있구나 정도만 알면 된다.
1.1. manifest
manifest에 Activity및 관련된 특정 속성을 선언해야 앱에서 Activity를 사용할 수 있다.
Activity를 선언하려면 manifest 파일을 열고
<manifest ... >
<application ... >
<activity android:name=".ExampleActivity" />
...
</application ... >
...
</manifest >
안드로이드 스튜디오에서 자동으로 생성되는 템플릿 코드에서는 MainActivity가 최초로 실행되도록 있지만 manifest에서
<activity
android:name=".MainActivity">
<intent-filter>
<!--MAIN action과 LAUNCHER category를 지정하여 최초 실행 -->
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
2. Activity 생명 주기
사용자가 앱을 탐색하고, 앱에서 나가고, 앱으로 다시 돌아가면, 앱의 Activity인스턴스는 생명 주기 안에서 서로 다른 상태를 통해 전환된다. Activity 클래스는 상태 변화(시스템이 Activity를 생성, 중단 또는 다시 시작하거나, 프로세스를 종료하는 등)를 알아차릴 수 있는 여러 콜백을 제공한다.
사용자가 Activity를 벗어났다가 다시 돌아왔을 때 Activity가 작동하는 방식을 생명 주기 콜백 메서드에서 선언할 수 있다. 예를 들어 스트리밍 동영상 플레이어를 빌드하는 경우, 사용자가 다른 앱으로 전환할 때 동영상을 일시중지하고 네트워크 연결을 종료한다음 사용자가 돌아오면 네트워크를 다시 연결하고, 사용자가 일시중지한 지점에서 동영상을 다시 시작하도록 허용한다. 즉, 각 콜백은 상태 변화에 적합한 특정 작업을 실행할 수 있도록 한다. 적시에 알맞은 작업을 하고 적절하게 전환을 처리하면 앱이 더욱 안정적으로 기능할 수 있다.
Activity 생명 주기 단계 간에 전환하기 위해 Activity 클래스는 6가지 콜백으로 구성된 onCreate(), onStart(), onResume(), onPause(), onStop(), onDestroy()를 제공하며 Activity가 새로운 상태에 들어가면 시스템은 각 콜백을 호출한다. 다음은 이러한 패러다임을 시각화한 그림이다.
2.1. 생명주기 Call Back
2.1.1. onCreate()
시스템이 Activity를 생성할 때 실행되는 콜백으로 필수적으로 구현해야 한다. Activity 생성 시 Activity는 ‘Created’ 상태(state)가 된다. 해당 메서드에서는 Activity의 전체 생명 주기 동안 한번만 발생해야 하는 기본 시작 로직을 수행한다. 예를 들어 View를 생성하고 데이터를 List에 결합하는 등의 작업이 여기에서 이루어지며 setContentView()
를 호출하여 레이아웃을 정의해야 한다.
onCreate()
가 완료되면 다음 콜백은 항상 onStart()
이다.
2.1.2. onStart()
onCreate()
가 종료되면 Activity는 ‘Started’ 상태로 전환되고 Activity가 사용자에게 표시된다. 이 콜백에는 Activity가 포그라운드로 나와서 대화형이 되기 위한 최종 준비에 준하는 작업이 포함된다.
onStart()
는 매우 빠르게 완료되고 Activity가 ‘Resumed’상태에 들어가며 onResume()
를 호출한다.
2.1.3. onResume()
‘Resumed’ 상태에 들어갔을 때 앱은 사용자와 상호작용을 한다.
어떤 이벤트가 발생하여 앱에서 포커스가 떠날 때까지 앱이 이 상태에 머무른다. 예를 들어 전화가 오거나, 다른 Activity로 이동하거나, 기기의 화면이 꺼지는 이벤트가 이에 해당된다.
방해되는 이벤트가 발생하면 활동은 ‘Paused’ 상태가 되고 시스템이 onPause()
를 호출한다.
Activity가 ‘Paused’ 상태에서 ‘Resumed’ 상태로 전환돌아오면 onResume()
을 다시 한번 호출한다. 따라서 해당 메서드를 통해 Activity가 재개될때 마다 필요한 초기화 작업을 수행할 수 있다.
2.1.4. onPause()
Activity가 포커스를 잃고 ‘Paused’ 상태로 전환될 때 시스템은 onPause()
를 호출한다. 이 때는 엄밀히 말하면 Activity가 여전히 부분적으로 표시되지만 대체로 사용자가 Activity를 떠나고 있으며 해당 Activity가 조만간 ‘Stoppped’ 또는 ‘Resumed’ 상태로 전환됨을 나타낸다.
사용자가 UI 업데이트를 기다리고 있다면 ‘Paused’ 상태의 Activity는 계속 UI를 업데이트할 수 있다. 따라서 UI관련 리소스와 작업을 완전히 해제하거나 조정할 때는 onPause()
대신 onStop()
을 사용하는 것이 좋다.
onPause()
는 아주 잠깐 실행되므로 저장 작업을 실행하기에는 시간이 부족할 수 있다. 그러므로 onPause()
를 사용하여 애플리케이션 또는 사용자 데이터를 저장하거나, 네트워크 호출, 데이터베이스 트랜잭션을 실행해서는 안 된다. 이러한 작업은 메서드 실행이 끝나기 전에 완료되지 못할 수도 있다. 부하가 큰 종료 작업은 onStop()
에서 실행해야 한다.
onPause()
가 실행을 완료하면 다음 콜백은 상황에 따라 onStop()
또는 onResume()
가 호출된다.
2.1.5. onStop()
Activity가 사용자에게 더 이상 표시되지 않을 때 시스템은 onStop()
을 호출한다. 이는 Activity가 제거 중이거나 새 Activity가 시작 중이거나 기존 Activity가 ‘Resumed’ 상태로 전환 중이고 중지된 Activity를 다로고 있기 때문에 발생할 수 있다. 이 모든 상황에서 중지된 Activity는 더 이상 표시되지 않는다.
onStop()
에서는 앱이 사용자에게 보이지 않는 동안 필요하지 않은 리소스를 해제하거나 조정해야 한다. 또한 CPU를 비교적 많이 소모하는 종료 작업을 해당 메서드에서 실행을해야 한다.
시스템은 다음 콜백으로 Activity가 사용자와 상호작용하기 위해 다시 시작되면 onRestart()
, 완전히 종료되면 onDestroy()
를 호출한다.
2.1.6. onRestart()
‘Stopped’상태의 Activity가 다시 시작되려고 할 때 시스템은 이 콜백을 호출한다. 해당 메서드는 Activity가 중지된 시간부터 Activity 상태를 복원한다. 이 콜백 뒤에는 항상 onStart()
가 온다.
2.1.7. onDestroy()
시스템은 Activity가 제거되기 전에 이 콜백을 호출한다.
Activity가 제거되는 상황은 다음과 같다.
- (사용자가 Activity를 완전히 닫거나 Activity에서
finish()
가 호출되어) Activity가 종료되는 경우 - 구성 변경(예: 기기 회전 또는 멀티 윈도우 모드)으로 인해 시스템이 일시적으로 Activity를 소멸시키는 경우
이 콜백은 Activity가 수신하는 마지막 콜백으로 Activity또는 포함된 프로세스가 제거될 때 모든 리소스를 해제하도록 구현된다.
3. Fragment
Fragment는 앱 UI의 재사용 가능 부분을 나타낸다. Fragment는 자체 레이아웃을 정의 및 관리하고 자체적으로 생명 주기를 보유하고 입력 이벤트를 처리할 수 있다. 다만 Fragment는 독립적으로 존재할 수 없으며 Activity또는 다른 Fragment로부터 호스팅되어야 한다는 특징이 있다.
3.1. 모듈성
Fragment는 UI를 개별의 덩어리(Chunk)로 분할할 수 있도록 하는 것으로 Activity의 UI에 모듈성과 재사용성을 보장?해준다. Activity에 전역 요소(계속 사용될 요소)를 배치하고 단일 화면이나 화면 일부의 UI를 Fragment로 정의하고 관리할 수 있다.
쉽게? 예를 들자면 header와 footer를 Activity에 지정하고 main에 들어갈 내용을 Fragment에 지정하는 것으로 Fragment 전환이 일어날 때 header와 footer를 재사용하고 main의 내용만 독립적으로 생성, 관리할 수 있다.
4. Fragment 생명 주기
각각의 Fragment 인스턴스에는 고유한 생명 주기가 있다. 사용자가 앱을 탐색하고 상호 작용할 때 Fragment는 추가, 제거, 시작 또는 종료에 따라 생명 주기의 다양한 상태(State)로 전환된다.
- INITIALIZED
- CREATED
- STARTED
- RESUMED
- DESTROYED
Reference
- 안드로이드 개발자 공식 가이드 : https://developer.android.com/guide