안드로이드 OS나 다른 앱이 발송하는 시스템 이벤트 신호를 수신하여 독립적인 처리를 수행하는 브로드캐스트 리시버(BroadcastReceiver) 컴포넌트를 배웁니다.
1. 브로드캐스트리시버 핵심 개념
- BroadcastReceiver: 단말기의 상태 변화(배터리 부족, 부팅 완료, 네트워크 변경)나 사용자 정의 알림 이벤트를 감지하는 4대 컴포넌트입니다.
- 정적 등록: AndroidManifest.xml에 선언하여 앱 미실행 중에도 이벤트를 감지합니다.
- 동적 등록: 코틀린 코드에서 registerReceiver() 및 unregisterReceiver()로 수신 범위를 제어합니다.
2. 동적 배터리 감지 리시버 구현
class MainActivity : AppCompatActivity() {
private val receiver = object : BroadcastReceiver() {
override fun onReceive(context: Context?, intent: Intent?) {
if (intent?.action == Intent.ACTION_BATTERY_LOW) {
Toast.makeText(context, "배터리가 부족합니다!", Toast.LENGTH_SHORT).show()
}
}
}
override fun onResume() {
super.onResume()
registerReceiver(receiver, IntentFilter(Intent.ACTION_BATTERY_LOW))
}
override fun onPause() {
super.onPause()
unregisterReceiver(receiver)
}
}
5. 안드로이드 & 코틀린 실무 심화 개발 가이드 및 엔터프라이즈 최적화 (Deep Dive)
본 14. 브로드캐스트리시버 컴포넌트 - 동적/정적 리시버 등록 및 시스템 브로드캐스트 이벤트 레슨에서 다룬 핵심 이론 및 구현 패턴은 대규모 상용 모바일 앱 제작 시 앱의 안정성과 응답 속도(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% 이상 감소 효과를 누릴 수 있습니다.