안드로이드 개발을 하다 보면 Activity는 가장 자주 마주치는 구성요소입니다.
하지만 단순히 화면을 만드는 것에 그치고, Activity가 어떤 구조로 작동하는지,
라이프사이클은 어떻게 흐르는지, 그리고 올바르게 사용하는 방법을 모르는 경우가 많습니다.
이 글에서는 Activity의 개념부터 생명주기(Lifecycle),
실무에서 주의해야 할 포인트까지 정리해봅니다.
1. Activity란 무엇인가요?
안드로이드의 앱은 여러 화면으로 구성되어 있고, 그 하나하나가 바로 Activity입니다.
예를 들어, 로그인 화면, 홈 화면, 결제 화면 모두 각각 Activity로 구성되어 있죠.
즉, **Activity = 사용자와 상호작용하는 UI 단위이자 앱의 진입점(Entry Point)**입니다.
2. Entry Point란?
보통 Java/C++에서는 main() 함수가 앱의 시작 지점이죠.
하지만 안드로이드는 단일 진입점이 아닌 **4대 컴포넌트(Activity, Service, BroadcastReceiver, ContentProvider)**를 통해 다양한 경로로 앱 실행이 가능합니다.
이 중 Activity는 사용자와 직접 상호작용하는 UI 진입점으로 가장 대표적인 Entry Point입니다.
<!-- AndroidManifest.xml -->
<application>
<activity android:name=".MainActivity" />
</application>
Manifest.xml에 등록하지 않으면 시스템이 해당 Activity를 인식하지 못합니다.
3. Activity 설계 전략
- 화면마다 무조건 새로운 Activity를 만드는 것은 비효율적입니다.
- 간단한 UI 변화라면 Fragment, Dialog, Popup 등으로 충분히 구현 가능해요.
- Activity는 리소스가 크고 생명주기 관리가 복잡하므로, 필요할 때만 생성하는 것이 좋습니다.
4. Activity의 생명주기(Lifecycle)
Activity는 앱이 실행되면서 생성되고, 사용자가 나가거나 기기가 회전할 때마다 상태가 바뀌어요.
이러한 상태 변화에 따라 총 6개의 주요 콜백 메서드가 호출됩니다.
4-1. onCreate()
- Activity가 처음 생성될 때 한 번 호출
- UI 레이아웃 연결, ViewModel 초기화, 리스너 등록 등 초기 설정
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
}
4-2. onStart()
- Activity가 화면에 표시되기 직전 호출
- UI 요소를 보여주기 위한 준비 단계
4-3. onResume()
- Activity가 화면에 완전히 나타나고 포커스를 가질 때 호출
- 사용자와의 실질적 상호작용이 가능한 상태
override fun onResume() {
super.onResume()
// 리소스 재연결, 센서 등록 등
}
4-4. onPause()
- 새로운 Activity가 시작되거나, 화면 일부가 가려질 때 호출
- 리소스를 해제하거나 저장할 작업을 여기에 수행
override fun onPause() {
super.onPause()
// 음악 정지, 센서 제거, 애니메이션 중지 등
}
4-5. onStop()
- Activity가 더 이상 사용자에게 보이지 않을 때
- 오래 걸리는 저장 작업(DB 저장, 파일 쓰기 등)을 수행
4-6. onDestroy()
- Activity가 완전히 종료되기 직전 호출
- 리소스 해제의 마지막 기회
5. 생명주기 흐름 정리
상황 호출 순서
앱 시작 | onCreate → onStart → onResume |
화면 회전 | onPause → onStop → onDestroy → onCreate... |
홈 버튼 누름 | onPause → onStop |
돌아올 때 | onRestart → onStart → onResume |
백버튼으로 종료 | onPause → onStop → onDestroy |
6. 액티비티 전환 시 주의사항
Activity A → B로 전환할 경우
호출 순서:
- A: onPause() 호출
- B: onCreate() → onStart() → onResume() 호출
- A: 이후 onStop() 호출
즉, B가 완전히 보여진 후에야 A의 onStop()이 호출됩니다.
💡 onPause에서 리소스를 해제하면, B에서는 아직 그 값이 저장되지 않을 수 있음
→ onStop에서 해제 or 저장하도록 설계하세요.
7.생명주기 사용 시 주의사항
7-1. 리소스는 항상 대칭적으로 관리하세요
생성 해제
onCreate | onDestroy |
onResume | onPause |
// 예시
override fun onCreate() {
db = DBHelper(this)
}
override fun onDestroy() {
db.close()
}
7-2. finish() 후에는 반드시 return으로 종
if (조건) {
finish()
return // 이후 로직이 실행되지 않게 막기
}
8. 실무 적용 예시: ViewBinding + 라이프사이클 연동
class MainActivity : AppCompatActivity() {
private lateinit var binding: ActivityMainBinding
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding = ActivityMainBinding.inflate(layoutInflater)
setContentView(binding.root)
binding.btnStart.setOnClickListener {
// 액션 처리
}
}
}
9. 참고자료
- Android 공식 문서 - 액티비티 생명주기
- 『안드로이드 프로그래밍 Next Step』 p77~p92
- 『안드로이드 앱 프로그래밍 가이드』 p82~p87
10. 마무리
Activity는 단순한 "화면"을 넘어서 상태를 관리하고 사용자와 상호작용하는 핵심 컴포넌트입니다.
생명주기를 제대로 이해하고 관리하지 않으면 메모리 누수, 데이터 손실, 앱 충돌까지 발생할 수 있어요.
이번 기회에 Activity 구조와 동작 원리를 확실히 잡고 가세요!