안드로이드 4대 핵심 컴포넌트 중 첫 번째인 **액티비티(Activity)**의 6대 **생명주기(Lifecycle)**와 화면 간 데이터 이동 통로인 **인텐트(Intent)**를 심도 있게 학습합니다.
1. 액티비티 생명주기 6대 핵심 콜백
- onCreate(): 액티비티가 생성될 때 최초 호출되며 뷰 바인딩 및 필수 데이터 초기화를 실행합니다.
- onStart(): 화면이 사용자에게 보이기 직전에 호출됩니다.
- onResume(): 화면이 사용자 포커스를 완전히 얻어 입력 상호작용이 가능한 상태가 됩니다.
- onPause(): 다른 액티비티가 일부를 가리거나 포커스를 잃어 잠시 멈춤 상태가 됩니다.
- onStop(): 액티비티가 화면에서 완전히 가려져 보이지 않게 될 때 호출됩니다.
- onDestroy(): 액티비티가 완벽히 파괴되어 메모리에서 소멸될 때 호출됩니다.
2. Activity Result API 최신 구현 코드
class MainActivity : AppCompatActivity() {
private val launcher = registerForActivityResult(
ActivityResultContracts.StartActivityForResult()
) { result ->
if (result.resultCode == RESULT_OK) {
val returnVal = result.data?.getStringExtra("REPLY")
Log.d("ActivityResult", "받은 응답: " + returnVal)
}
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
val btnMove = findViewById<Button>(R.id.btnMove)
btnMove.setOnClickListener {
val intent = Intent(this, SecondActivity::class.java)
launcher.launch(intent)
}
}
}
5. 안드로이드 & 코틀린 실무 심화 개발 가이드 및 엔터프라이즈 최적화 (Deep Dive)
본 13. 액티비티 컴포넌트 - Activity 생명주기(Lifecycle), Intent 및 Activity Result API 레슨에서 다룬 핵심 이론 및 구현 패턴은 대규모 상용 모바일 앱 제작 시 앱의 안정성과 응답 속도(Performance), 메모리 사용량을 결정하는 주요 엔지니어링 팩터입니다.
1) 아키텍처 및 메모리 관리 지침 (Architecture & Memory Rules)
- 메모리 누수(Memory Leak) 방지 및 Context 참조 경계: Activity나 Fragment의 Context 객체를 장기간 유지되는 싱글톤 클래스나 Static 포인터에 저장해서는 안 됩니다. 전역 앱 정보가 필요한 경우 반드시
ApplicationContext를 전달하십시오. - 뷰 바인딩(ViewBinding) 및 리사이클러뷰(RecyclerView) 참조 해제: 프래그먼트 생명주기 상
onDestroyView()호출 시점에_binding = null을 지정하여 UI 계층의 메모리 참조 고리를 즉시 끊어주어야 메모리 릭을 방지할 수 있습니다. - 코루틴(Coroutines) 스레드 풀 분리 메커니즘:
- UI 렌더링 및 뷰 상태 변경:
Dispatchers.Main - I/O 통신, 파일 읽기/쓰기, Room DB 쿼리, 네트워크 REST API 호출:
Dispatchers.IO - 대용량 데이터 정렬, 딥러닝/이미지 가공 연산:
Dispatchers.Default
- UI 렌더링 및 뷰 상태 변경:
2) 앱 보안 및 구글 플레이 스토어 배포 지침 (Security & Publishing)
- 동적 런타임 권한(Runtime Permissions) 관리: 위치 정보, 카메라, 마이크 권한 요청 시 앱 시작 즉시 허용을 요구하는 방식 대신, 해당 기능이 실행되는 접점에서 사유 설명 다이얼로그와 함께 동적 요청을 시행합니다.
- 코드 난독화 및 최적화(R8 / ProGuard):
build.gradle.kts내isMinifyEnabled = true설정을 통해 사용하지 않는 코드를 제거(Tree-shaking)하고 소스 코드를 난독화하여 역공학(Reverse Engineering) 피해를 차단합니다. - API Key 및 서명 키 분리 보안: 비밀 API Key, Firebase 키는 프로젝트의
local.properties파일에 은닉 보관하고,BuildConfig를 통해 수신함으로써 공개 버전 관리(Git)에 누출되지 않도록 엄격히 방어합니다.
6. 핵심 요약 및 실무 FAQ (Summary & Q&A)
Q1. 본 챕터의 기능을 실제 프로젝트에 구동할 때 가장 자주 발생하는 대표적 오류는 무엇인가요?
- 안드로이드 메인 UI 스레드에서 무거운 네트워크 통신이나 DB 읽기/쓰기를 직렬 수행하다가
NetworkOnMainThreadException예외가 발생하거나 화면이 멈추는 ANR(Application Not Responding) 현상이 일어나는 것입니다. 반드시viewModelScope나withContext(Dispatchers.IO)를 통해 비동기 처리해야 합니다.
Q2. 신규 앱 프로젝트 구축 시 기존 구버전 사양 대신 최신 Jetpack 라이브러리를 도입하는 이점은 무엇인가요?
- 구버전의
findViewById나AsyncTask등은 널 안전성이 보장되지 않고 생명주기(Lifecycle) 변화에 취약하여 앱이 비정상 종료(Crash)될 확률이 높습니다. 최신 Android Jetpack(ViewBinding, Coroutines, Room, WorkManager)을 채택하면 가독성과 타입 안정성, 보일러플레이트 코드의 80% 이상 감소 효과를 누릴 수 있습니다.