일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
31 |
- 안드로이드 sms
- 셀룰로오스-g-폴리락타이드 공중합체
- TowmonUSB 연결오류
- 안드로이드 mvvm
- json 저장
- 비콘스캐닝
- TwomonUSB
- withContext
- 코틀린 이미지저장 #파일저장
- compse state
- 스레드 #코루틴
- 안드로이드스튜디오 jdk
- 코틀린 트리거 버튼
- 코루틴스코프
- compse collectAsState
- apk이름변경
- var 와 val
- 라이브데이터 postValue
- bluetoothmanager
- 안드로이드 스튜디오 애뮬레이터
- 커스텀스피너
- 토글 험수
- viewmodelscope
- 안드로이드 비콘
- 1회용 플라스틱컵
- #큐구조 #큐다운로드
- 플라스틱 생분해
- 코루틴 job
- 모의위치 주입
- Room 데이터베이스 업데이트
- Today
- Total
목록분류 전체보기 (55)
EnjoyLife
구글개발자들이 일을 안하는지 모르겠지만 요새 Narwhal 버전이 말썽이다. 빌드시간도 길고, 프리징현상도 잦고최초 git에서 clone을 하면 프로젝트에 import 되는데 10분이상 소용된다. 난 아예 포기했다.그래서 개발자들은 과거 버전으로 회기해서 사용하는 현상이 발생하고 있고, 나 또한 회기해서 만족하며 사용하고 있다.koala버전 너무 만족스럽다.AGP,Gradle 버전만 잘 맞추면 앱을 3년전 안드로이드스튜디오(Famingo.2022.2.1) 버전과 Narwal 버전에서 같이 사용가능하다.아래에 자세히 설명되어 있지만 눈에 잘 와닿지 않는다. https://developer.android.com/build/releases/gradle-plugin?hl=ko#updating-gradle사이트에..
상황 lifecycleScope/viewModelScope 사용 불가 이유 반드시 CoroutineScope 직접 써야 하는 이유1. Repository 등 "ViewModel이 아닌" 객체lifecycleScope/viewModelScope는 Activity, ViewModel에만 있음자체적으로 스코프 관리 필요2. 라이브러리 개발 (외부에 의존성 없이)앱 구조에 종속되면 안 됨독립적으로 코루틴 관리 필요3. 백그라운드 서비스/포그라운드 서비스Service에는 lifecycl..
코루틴 스코프 종류도 많고 역할도 각기 다르고 헷갈립니다.쉽게 외우는 방법을 공유합니다. 아래처럼 “L → V → G” 순으로 떠올리면 기억하기 쉽습니다.L: lifecycleScope소유자: Activity/Fragment용도: UI 관련 작업 → UI가 살아 있는 동안만 실행기억법: Lifecycle → Life(생명)V: viewModelScope소유자: ViewModel용도: 비즈니스 로직(네트워크·DB) → ViewModel이 살아 있는 동안 실행기억법: ViewModel → View(화면 뒤 로직)G: GlobalScope소유자: 앱 전체(Application)용도: 전역 작업(앱 프로세스 전체) → 수동 취소 필요기억법: Global(전역) Scope ..
Spinner 자체가 강제적으로 dropdown 을 닫는 기능을 고려해서 만들지 않았다. 기본적으로 스피너의 아이템 클릭하면 바로 dropdown 이 닫히기때문이다. 그래도 억지로 커스텀 스피너를 만들어 버튼을 이용해 dropdown을 닫고자 한다면 이 방법이 가장 간단하다 binding.btnAction.setOnClickListener { val parentView = parent as? AdapterView parentView?.performItemClick(binding.root, position, getItemId(position)) }
결론: 안드로이드 14에서 LocationManager 의 removeTestProvider,setTestProviderEnabled 함수를 사용못하게 막아놨기 때문에 사용불가하다.사용해도 "java.lang.IllegalArgumentException: gps provider is not a test provider" 오류가 발생한다.FusedLocationProviderClient 의 fusedClient.setMockMode(false) 호출만으로도 충분히 모의위치 주입 해제가 된다. 구글지도앱을 실행해도 실제 위치로 이동한것을 볼수 있다. // 100% 오류 발생 addedProviders.forEach { provider -> try { loc..
fun isServiceRunning(serviceClass: Class): Boolean { val activityManager = getSystemService(Context.ACTIVITY_SERVICE) as? android.app.ActivityManager ?: return false return try { activityManager.getRunningServices(Int.MAX_VALUE) .any { it.service.className == serviceClass.name } } catch (e: Exception) { false } }
✅ 백그라운드 최적화 핵심 체크리스트Foreground Service 필수: - 항상 startForeground() 호출, 알림 고정 - 절대 일반 Service로 실행하지 말 것서비스 분리: - “계속 살아 있어야 하는 비콘 감지(BeaconService)”는 Foreground - “일회성 작업(모의위치 주입)”은 짧게 실행 후 stopSelf()로 종료메모리 릭/과다 WakeUp 방지: - CoroutineScope(Dispatchers.Default)로 주기 작업 - 주기 체크(예: 2초) 외 불필요한 Timer, Handler, Alarm 사용 XDoze 모드/절전 예외 적용: - Foreground Service는 일반 절전 모드에서 살아남지만, - Doze 모드 심화(충전+화면 꺼짐)에서는..
신규 Android 앱을 만들 때는 JDK 17을 사용하는 것을 권장드립니다. 그 이유를 정리해 보면 다음과 같습니다.LTS(장기 지원) 안정성JDK 17은 2021년 9월에 나온 LTS 버전으로, 버그 픽스·보안 업데이트가 최소 2029년까지 지원됩니다.JDK 21 역시 LTS이지만 출시(2023년 9월)가 비교적 최근이라, Android 생태계 전반에서 아직 검증·호환성 테스트가 충분히 이뤄지지 않았습니다.Android Gradle Plugin(AGP) 호환성현 시점(2025년 기준) Android Studio·AGP 공식 문서 상으로는 JDK 17까지 안정적으로 지원됩니다.JDK 21을 쓰려면 Gradle 8.5 이상, AGP 8.5 이상으로 모두 업그레이드해야 하는데, 일부 서드파티 플러그인이나 ..