최근에 서버 개발자분이 안드로이드 위젯에 관한 질문을 주셔서 알아보다가 JetPack Compose에서는 어떻게 위젯을 만드는지에 대한 궁금증이 생겼습니다. 어떤 라이브러리를 사용하고 어떻게 개발하는지 알아보려고 합니다! 1. Glance 라이브러리 추가 implementation "androidx.glance:glance-appwidget:1.0.0-alpha05" 우선, 앱 위젯을 사용하기 위한 라이브러리를 추가해 줍니다. (아직 Jetpack용 Glance는 알파 버전만 출시된 상황입니다.) Glance는 선언형 Kotlin API를 제공하므로, 훨씬 적은 코드로 보기에도 좋고 반응이 빠른 앱 위젯을 빌드할 수 있다고 합니다. 해당 라이브러리를 사용해보니 compileSdk가 33인 곳에서 실행이 ..
Flow는 스스로 라이프사이클을 알지 못하기 때문에 CoroutineScope에 따라 생명주기에 따라 맞추어 사용하며 불필요한 메모리나 리소스가 낭비되지 않도록 하는 것이 중요합니다! 이번에는 LifecycleOwner.launchWhenStarted, Lifecycle.repeatOnLifecycle 등이 어떻게 다른지 알아보고 어떻게 불필요한 리소스 낭비를 방지해야 할지 알아보려고 합니다. lifecycleScope.launch private val _stateFlow = MutableStateFlow(0) val stateFlow get() = _stateFlow private fun testCount() { viewModelScope.launch(Dispatchers.IO) { repeat(10)..
최근 MVI를 공부하면서 여러 예제 프로젝트를 보면서 공부하던 중 Channel을 이용하여 상태값을 주고 받는 것을 알게 되었습니다. 이참에 Channel에 대해서도 알아보고자 합니다! 1. Channel 이란 Channel은 두개의 Coroutine 사이를 연결한 파이프이며, 단방향보다는 여러 방향에서 데이터를 주고 받는 형식으로 코루틴끼리 데이터를 전달하기 위한 것입니다. Channel은 BlockingQueue와 유사하지만, 약간의 차이점이 존재합니다. BlockingQueue은 put(), take()를 사용하여 차단해서 전송하는 방법이고 Channel은 send(), receive()를 사용하여 일시중단(suspend)으로 전송하는 방식입니다. 또한, Channel은 더 이상 사용하지 않을 때 ..
대다수의 앱에서 로그인이나 중요한 인증이 필요한 경우 비밀번호가 아닌 얼굴 인식, 지문 인식 같은 생체 인식 인증을 요청하는 방법을 사용하는데요, 오늘은 안드로이드 프로젝트에 어떻게 적용하는지 공부해보려고 합니다! 어떤 라이브러리를 사용하고 어떻게 프로젝트에 적용하는지 알아보도록 하겠습니다. 어떤 라이브러리를 사용하는가? 안드로이드 생체 인식을 위한 라이브러리는 두 가지가 존재합니다. 바로 FingerPrintManager와 BiometricPrompt 입니다. - FingerPrintManager : API 레벨 23 ~27 - BiometricPrompt : API 레벨 28 이상 AndroidX 생체 인식 라이브러리를 사용하기 전에는 자체 인증 UI를 만들어야 했지만, AndroidX로 이전을 통해..
Kotlin에는 확장 함수(Extension Function)가 존재합니다. 확장 함수를 사용하면 여러 장단점이 존재하며 Android 개발을 할 때도 종종 사용되곤 합니다! 오늘은 확장 함수에 대해 정리해보도록 하겠습니다. 먼저 확장 함수가 무엇인지에 대해 알아보도록 하겠습니다. 확장 함수(Extension Function)이란? 코틀린은 클래스에 상속하거나 디자인 패턴을 사용하지 않고 새로운 기능으로 클래스를 확장할 수 있는 기능을 제공하는데 이것이 확장(extension)이라는 선언을 통해 이루어지게 됩니다. 이때 추가적인 메소드를 구현하면 이를 확장 함수 라고 하고 추가적인 프로퍼티를 구현하면 확장 프로퍼티라고 합니다. 마치 기본 클래스에 정의된 함수인 것처럼 새로운 기능을 추가하는 기능! 언제 ..
앱을 사용하다 보면 서버에서 데이터를 받아오는 과정에서 로딩 프로세스바나 리스트 모양이 반짝거리는 등의 효과를 볼 수 있습니다. 이러한 효과들은 사용자에게 데이터를 받아오는 중이라는 것을 명시할 수 있고, 로딩 애니메이션에는 스켈레톤 UI, 루프 애니메이션, 프로그래스 바 등 다양한 방법이 있습니다. 그중에서 오늘은 스켈레톤 로딩을 구현하는 방법에 대해 공부해보려고 합니다.! (Compose 또한 어떻게 적용하는지 궁금해서 xml과 Compose 모두 다뤄보려고 합니다.) XML 스켈레톤 UI를 구현하는 방법은 다양하지만, 가장 많이 사용되는 facebook에서 제공하는 라이브러리인 shimmer-android를 사용해보도록 하겠습니다. 우선 build.gradle에 라이브러리를 추가합니다. // Gra..
💁단일 데이터가 아닌 경우는 어떻게 할까요, 앞서 공부한 just()나 create()는 단일 데이터를 주로 다루어 보았는데요. 이번에는 단일 데이터가 아닐 경우에 어떻게 사용하는지 즉 fromXXX() 계열 함수에 대해 알아보도록 하겠습니다. fromArray() 함수 Integer[] arr = {100,200,300}; Observable source = Observable.fromArray(arr); source.subscribe(System.out::println); 🎈int [] 배열 사용하기 int[] 배열을 실제로 그대로 넣으면 올바른 실행결과가 나오지 않습니다. ⇒ toIntegerArray()를 사용해야 합니다. int[] intArray = {400,500,600}; Observabl..
오늘은 Rxjava의 핵심 Observable을 공부해보려고 합니다. 내용이 많아서 단일 데이터와 다중일 때를 나눠서 공부해보도록 하겠습니다~! RxJava 2.x Observable, Maybe, Flowable Observable 클래스 Observable은 옵서버 패턴을 구현하며, 옵서버 패턴은 객체의 상태 변화를 관찰하는 관찰자 목록을 객체 등록. 상태 변화가 있을 때마다 메서드를 호출하여 객체가 직접 목록의 각 옵서버에서 변화를 알려준다. 💡Observable이 전달하는 세 가지의 알림 onNext : Observabled이 데이터의 발행을 알림 onComplete : 모든 데이터의 발행을 완료했음을 알리고, 단 한 번만 발생하며 발생한 후에는 더 이상 OnNext 이벤트가 발생해서는 안된다. ..