Android(95)
-
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 -
구조적 동시성을 위한 코루틴 스코프 가이드
안드로이드 Coroutines Scope 완전 가이드— GlobalScope, viewModelScope, supervisorScope 한 번에 정리했다코루틴을 쓰다 보면 어떤 Scope를 써야 할지 헷갈린 적이 많았다.특히 GlobalScope는 쓰면 안 된다고 해서 이유를 찾아봤고,viewModelScope, lifecycleScope, coroutineScope, supervisorScope까지 한 번에 정리해보았다.1. GlobalScope— 쓰면 안 된다고?생명주기와 무관해서 화면이 닫혀도 코루틴이 계속 실행되기 때문에 그 상태에서 죽은 UI에 접근하면 크래시가 난다.취소 전파가 없다. 부모가 사라져도 작업은 계속 돈다.추적이 힘들다. 누가 만든 Job인지 관리가 안 된다.❌ 화면 크래시 예시f..
2025.08.12 -
안드로이드 XMPP 연결 속도 최적화 — 5초에서 0.5초로 줄인 실전 기록
회사에서 담당하고 있는 앱의 소켓 연결이 느리다는 민원이 들어왔다.예전부터 느리다는 의견이 많아 최적화에 집중했던 곳이지만 여전히 느려 다시 한 번 최적화를 시도했다.그리고 확연히 빨라진 속도를 기록해보고자 한다. 1. 문제 상황현상평소엔 400~500ms 안에 연결되던 XMPP가 사람이 몰리면 5~10초 이상 걸림서버는 정상, iOS는 정상 → 안드로이드만 문제 발생2. 원인 추적 과정첫 번째 단서: 연결 과정별 타임로깅initXMPPConnection took 13 msconnect() took 130 mslogin() took 122 mssendPresence took 1 mstryToConnect total took 910 ms특정 구간만 느려짐need_bind 단계에서 notifyInitial..
2025.08.11 -
Android RecognitionListener로 음성 인식하기
Android에서 RecognitionListener는 SpeechRecognizer를 통해 음성 인식을 수행할 때,음성 인식 과정의 다양한 단계에서 발생하는 이벤트들을 수신하고 처리하기 위한 인터페이스이다.이를 통해 음성 인식의 흐름을 파악하고, 인식 결과를 활용하거나 오류 상황에 대처할 수 있다. 1. onReadyForSpeech(Bundle params)호출 시점: 음성 인식기가 사용자의 말을 들을 준비가 완료되었을 때.역할: "말씀하세요" 같은 UI 안내 표시, 마이크 아이콘 활성화 등.2. onBeginningOfSpeech()호출 시점: 사용자가 실제로 말을 시작한 것이 감지되었을 때.역할: "듣고 있어요..." 같은 UI 피드백, 녹음 애니메이션 시작 등.3. onEndOfSpeech()호..
2025.05.26 -
[삽질기] JDK 17.0.9에서 17.0.11로 올렸더니 Kapt가 말썽? 해결 방법 공유!
나는 JDK 17을 사용 중이었고, 새로운 프로젝트 파일을 받게 되었다.모든 세팅을 JDK 17로 맞춰놓고 빌드 시도 !!java.lang.IllegalAccessError: superclass access check failed: class org.jetbrains.kotlin.kapt3.base.javac.KaptJavaCompiler (in unnamed module @...) cannot access class com.sun.tools.javac.main.JavaCompiler (in module jdk.compiler) because module jdk.compiler does not export com.sun.tools.javac.main to unnamed module @...응? 잠깐만…왜..
2025.05.23