분류 전체보기

Android

Android EditText Text Repeating(글자 복제되는 현상)

오늘은 EditText에서 문자 입력 시 글자가 계속 복제되었던 문제를 소개한다. 발생 배경ID 입력을 모두 소문자로 강제해달라는 요구가 있었다. 이전에 모두 대문자로 강제해본 기억이 있었고, 그 때 사용했던 방법은 EditText.setFilters 였다.editText.filters = arrayOf(InputFilter.AllCaps())이런 식으로 말이다. 그래서 InputFilter를 잘 조절하면 소문자 강제도 어렵지 않겠다는 생각이 들었다. 그렇게 탄생한 코드는 아래와 같다.editText.filters = arrayOf(InputFilter { inputText, i, i2, spanned, i3, i4 -> inputText.toString().lowercase()}되게 합리적인 코드라고 ..

Language/Kotlin

LifecycleScope 간단히 알아보기

이번 글에서는 LifecycleScope를 소개해본다. 다만 제목 그대로 간단히 알아보려 하는데 이전 글에서 알아본 ViewModelScope와 비슷하기 때문이다. LifecycleScope의 lifecycle 알아보기생명주기는 생각보다 심플하다.  Lifecycle owner가 살아있는 동안 해당 스코프도 살아있게 된다. 상황에 따라 Activity, Fragment 등이 될 수 있다. 해당 owner가 destroy될 때 LifecycleScope에서 실행된 모든 코루틴은 cancel된다. 가장 대표적인 destroy 상황은 화면 회전에 의한 Activity destroy이다. 이렇게 되면 특정 작업을 수행하다가도 cancel되어버리는 상황이 발생하기에이런 경우, ViewModelScope를 사용하는..

Language/Kotlin

ViewModelScope 알아보기

이번에는 드디어 이전 예제들에서 사용해왔던 viewModelScope에 대해 알아보도록 하자. ViewModelScope LifecycleviewModelScope는 ViewModel의 lifecycle과 연관되어 있다. 다르게 말하면 viewModelScope에서 시작된 코루틴은 ViewModel이 살아있는 경우 계속 실행된다. 당연히 ViewModel onCleared 메소드가 호출되는 시점에viewModelScope에서 시작된 코루틴은 모두 cancel된다. ViewModelScope 구현 살펴보기이 스코프는 ViewModel이 clear될 때 자동으로 cancel된다는위의 lifecycle 설명에서 말했던 부분이 보인다. Dispatcher 확인하기MainCoroutineDispatcher.imm..

Language/Kotlin

GlobalScope 알아보기

GlobalScope에 대해 설명하기 전 가장 저명한 사실을 하나 얘기하고 시작한다. 우리는 앱에서 GlobalScope를 사용할 일이 거의 없을 것이다. 공식문서에서도 되도록 사용하지 않는 것을 권장하는 뉘앙스를 풍긴다. 사용하지 않을 이유 찾기 제한된 수명 주기가 없다.이 뜻을 앱 관점에서 보면 GlobalScope 안에서 시작된 코루틴은앱 프로세스가 종료될 때까지 종료되지 않는다는 것이다. 어떠한 Job에도 엮이지 않는다.제목 그대로를 코드로 확인해보자.println("GlobalScope Job: ${GlobalScope.coroutineContext[Job]}")이 코드를 실행시켜보자.GlobalScope Job: null위와 같은 결과가 나온다. 위 결과로 유추할 수 있는 것이 또 하나가 생겼..

Android

Store Signed APK 실행 시 Play Store로 이동

이번 글은 누군가에게 전혀 겪어보지 못한 상황일 것이다. 반면에, 나에게는 매우 당황스러운 상황이었다. 문제 상황스토어 비공개 테스트 트랙에 앱 번들(aab)를 업로드했다. APK 파일을 따로 달라는 요청이 있었다. 따라서, 서명된 범용 APK를 다운로드해 전달했다. 그런데 실행하자마자 Play Store로 이동하면서 Google Play에서 다운로드하라는 메시지가 보였다. 대체 뭐가 문제일까?도저히 머리로는 이해가지 않는 동작이었다. 따라서, 구글 정책 변경 사항이겠거니.. 하며 Play Console 고객센터로 문의해보았다.  짧게 요약하면 APK 실행 관련해서는 안내가 불가능하고 Google Play에서 설치 버튼을 눌러 내용이었다. 보다시피 내가 원하던 답변은 아니었다. 이 찝찝함을 안고 다른 설..

Language/Kotlin

Structured Concurrency in Coroutines

이번 글에서는 구조적 동시성(Structured Concurrency)의 특징을 정리해본다. 1. 모든 코루틴은 제한된 수명이 있는 위치에서 시작되어야 한다.가장 대표적인 예로 Activity가 될 수 있다. RxJava에서는 특정 시점에서 disposable을 모아 처리해야 하는데컴파일러는 개발자가 처리하는 코드를 작성하지 않아도 경고하지 않는다. 이렇게 clear 혹은 cancel의 과정이 없다면OOM(Out Of Memory) 에러 혹은 앱 크래시가 발생할 수 있을 것이다. 반면에 코루틴을 사용할 때 예시로 사용했던 코드를 보면 viewModelScope가 있다. 이 스코프는 ViewModel 수명에 엮여있다. 따라서 ViewModel이 수명에 따라 clear될 때,viewModelScope에서 실..

Android

Android Share Image File In 2way

이번 주제는 제목 그대로 이미지 파일을 2가지 방법으로 소개하는 것이다. 근데 굳이 2가지 방법을..?나도 굳이 같은 기능을 2가지 방법을 생각하면서 개발하고 싶지는 않았다. 처음 프로젝트에서 사용한 방법은 ShareCompat을 사용하는 것이었다. 최대한 Jetpack 라이브러리를 활용하고 싶었고 그 욕심이 철저히 반영된 코드였다. 물론 기능도 무사히 동작했다. 하지만 또다른 프로젝트는 android support 버전을 사용 중이다.(Jetpack이 없다는 말이다.) 따라서 Jetpack ShareCompat을 사용할 수 없었고, 그에 따라 기본 Intent를 사용해 처리해야만 했다. support library에도 ShareCompat은 있지만 해당 클래스의 동작이 동일하다는 보장을 하기 어렵다.(..

Android

Android add library using toml

toml 파일을 사용하게 된 계기이번 신규 프로젝트를 진행하게 되었는데,그에 따라 프로젝트 자체를 새로 생성하면서 build.gradle 언어를 Kotlin DSL로 설정했더니Android Studio Koala를 쓰는 나에게 toml이 포함된 프로젝트가 생성되었다. 여기저기 오픈소스 라이브러리에서 혹은 developer 사이트에서도 자주 볼 수 있는 녀석이라이번 기회에 써보기로 했다. Retrofit 추가해보기어차피 대부분 앱은 네트워크 작업이 필요하고 그에 따라 가장 대중적인 라이브러리는 단연 Retrofit일 것이다. 하지만, 기존 toml을 사용해본적 없는 나로서는 상당히 검색할 시간이 필요했다. 먼저 toml 파일 수정하기[versions]... //retrofit = "2.11.0"serial..

Android

Android QR Code Generation

기능 추가 배경QR코드를 통해 로그인 정보를 공유한다. 물론 로그인 정보는 민감한 정보이므로 암호화가 필요하다. 장점서버가 필요없다.OS간 직접 파일을 옮기는 것이 아니기에 플랫폼 제약이 없다. 단점길이에 제한이 있다.카메라만으로도 정보가 보일 수 있어 비교적 보안에 약한 편이다.(암호화를 한다고 해도 말이다.) 라이브러리 추가하기여기서 사용한 라이브러리는 이전 글에서도 등장한 적이 있다.https://github.com/journeyapps/zxing-android-embedded GitHub - journeyapps/zxing-android-embedded: Barcode scanner library for Android, based on the ZXing decoderBarcode scanner l..

Android

Android Watchdog 기능 추가하기(OS 9)

이번 글은 기능에 대해 소개하기 전, 먼저 OS 9(Pie)을 타겟으로 만든 기능임을 알린다. 기능 및 배경 소개우리가 어떤 프로그램이 지속 실행되어야하는 상황에 만약을 대비해 넣는 기능 중에 하나가한번쯤은 봤을만한 꺼지면 재실행하는 기능이다. 이 기능은 보통 Watchdog(와치독, 워치독)이라 불린다. 이번에 안드로이드 셋톱박스에 맞추어 앱을 제작하게 됐는데이 때, 꺼지지 않는 앱이 필요했고 만에 하나를 대비해 이 기능을 준비하게 되었다. Manifest 수정하기먼저 Foreground Service 권한을 설정해야 한다. 갑자기 무슨 Foreground Service인가 싶을 수 있다. Background Service에서 Activity를 실행할 수는 있지만(하위 OS이기에 가능하지만)OS에서 S..

BonusTrack02.dev
'분류 전체보기' 카테고리의 글 목록