Android/Android 기초(14)
-
Activity launchMode 정리: singleTop vs singleTask 차이
앱을 배포하기 전 테스트하는 과정에서 갑자기 기존에 나지 않던 오류가 발생했다.Activity가 계속 겹겹이 쌓이는 현상.그쪽 소스코드는 고친 적이 없는데 무슨 일인가? 하나씩 히스토리를 따라 찾아가기 시작했고, AndroidManifest에서 단서를 발견했다.안드로이드 launchMode에서 singleTop과 singleTask는 Activity의 재사용 여부 Task 관리 방식에서 차이가 있다.이 사실을 모르는 나는 아무 생각 없이 이 부분을 고쳤고, Activity가 무한히 생성되는 이슈를 발견했다.singleTop동일 Task 안에서 이미 해당 Activity 인스턴스가 맨 위(top) 에 있으면 → 재사용맨 위가 아니면 → 새 인스턴스를 생성해서 위에 올림즉, "Top에 있으면 재사용, 아니면..
2025.08.19 -
Android에서 Activity 생성은 왜 비동기인가: 안드로이드 전환 아키텍처 정리
1. 안드로이드의 UI 스레드 모델Android 앱은 UI 스레드(Main Thread) 위에서 화면을 그림Activity 생성/삭제 같은 라이프사이클 이벤트도 메인 스레드에서 처리되지만, 이는 즉시 동기 처리가 아니라 메시지 큐 기반의 비동기 처리즉, "호출 → 바로 완료"가 아니라, 이벤트가 메시지 큐에 등록되고, 차례가 되면 실행2. 생성과 소멸의 흐름(1) 생성 과정startActivity() 호출 → 내부적으로 ActivityThread에 메시지를 보냄.Looper가 해당 메시지를 읽어 Activity 인스턴스 생성 → onCreate → onStart → onResume 순으로 호출.이 과정은 즉시 실행되는 것처럼 보이지만, 사실은 다음 UI 루프에서 처리(2) 소멸 과정finish() 호출 ..
2025.08.13 -
Parcelize vs Serializable 차이점 한눈에 보기
Serializable : Java의 기본 직렬화 방식class User(val name: String, val age: Int) : Serializable장점:구현이 매우 쉽다. implements Serializable만 하면 끝.Java 표준이라 Android 외의 환경에서도 사용 가능.단점:리플렉션 기반 → 느리다.성능이 중요한 Android 환경에선 이게 큰 단점.어떤 필드가 직렬화되고 있는지 명시적으로 제어 불가.Parcelable (+ @Parcelize) : Android 전용 직렬화 방식@Parcelizedata class User(val name: String, val age: Int) : Parcelable장점:Android에 최적화된 고속 직렬화.메모리 복사 수준으로 빨라서 성능이 ..
2025.04.02 -
Single Activity Architecture(SAA) 전환 시 Navigation 구조 설계 방법
안드로이드 앱을 Single Activity Architecture(SAA)로 전환할 때, 가장 많이 고민하게 되는 포인트는 바로 Navigation 구조다.기존에는 Activity 단위로 화면을 나눴다면, 이제는 하나의 Activity와 하나의 NavHost 안에서 모든 화면 전환이 이루어져야 한다.핵심 원칙NavHost는 하나만!AppNavGraph에서 전체 라우팅 담당Activity마다 NavHost를 여러 개 두는 구조는 Compose + SAA에서 지양하위 기능은 NavGraphBuilder 확장 함수로 분리ChatNavGraph, OpenChatNavGraph처럼 묶고 싶다면 NavGraphBuilder 확장 함수로 정의실제 NavHost는 AppNavGraph에만 존재해야 함실전 TIPCha..
2025.03.28 -
[Android] 왜 Log.d() 대신 Timber를 써야 할까?
자꾸 Android Studio에서 Log.d를 Timber로 변환하라는 메세지가 뜬다.대체 Timber가 뭐길래.1. Log.d()의 단점1️⃣ 태그를 직접 써야 함Log.d("MyActivity", "Something happened")MyActivity 와 같은 TAG를 계속 명시해줘야 한다.2️⃣ 릴리즈 빌드에서도 로그가 찍힐 수 있음디버깅용 로그가 사용자 환경에서도 노출될 위험이 있음3️⃣ 로그 필터링, 커스터마이징 어려움로그 포맷, 조건부 출력 등 확장성이 떨어짐2. Timber의 장점1️⃣ 자동 태그 처리Timber.d("Hello")로그에 자동으로 클래스 이름 + 라인 번호가 붙는다.D/MainActivity: Hello (MainActivity.kt:42)2️⃣ 릴리즈 빌드에서 로그 자동..
2025.03.26 -
android:exported 속성 필수 이유 (Android 12 대응)
Android 12(API 31) 이상부터는 Intent-filter가 설정된 컴포넌트(Activity, Service 등)는반드시 android:exported를 명시해야만 한다.명시하지 않으면 Manifest 병합 시 에러가 발생해서 앱이 아예 빌드되지 않는다. ▶️ true: 외부 앱에서 이 Activity 실행 가능 (런처 진입점 등)▶️ false: 내부 컴포넌트 (BroadcastReceiver 등 내부 호출만 허용) 몰랐을 땐 그냥 안 써도 되던 거지만,이제는 무조건 써야 하는 필수 속성임을 알게 됐다.
2025.03.24