Android

    [Android] WorkManager + Coroutine으로 매일 특정시간에 Notification 띄우기

    매일 오후 12시에 유저에게 '특별한' Notification을 띄울 수 있는 기능을 제공하고 싶었다. 물론 이 방법을 구현하는 데에는 여러 방법이 있을 수 있다. 서버에서 각 유저에게 FCM을 보내는 방법도 있고 (Super Heavy ^^;), 죽지않는 서비스를 구현하여 12시마다 Notification을 띄워주도록 하는 방법도 있을 수 있겠다. 하지만 후자는 구글에서 지속적으로 막으려는 것을 어떻게든 피한 편법에 가깝다. 따라서 구글에서 계속해서 써보라고 제안하고있는 WorkManager을 사용하여 이를 구현하기로 했다. 사실 WorkManager는 꼭 한번이라도 써보고 싶어 예전부터 눈독들여 왔었다. 그동안 죽지않는 서비스 등의 편법으로 백그라운드 처리를 해왔기에, 뭔가 Official 하지 않은..

    [Android/Kotlin] Error Handling By CoroutineExceptionHandler In MVVM Architecture

    viewModel 내에서 Coroutine을 활용하다 보면, 에러 처리를 하기 위해 try ~ catch문을 활용하곤 합니다. 그러나 이를 남용하면 Boiler Plate가 되어버리게 됩니다. 전역적으로 발생할 수 있는 에러들을 CoroutineExceptionHandler을 통해 다루는 방법을 알아봅시다. 구현 방법에 대한 자세한 예시는 링크를 통해 보실 수 있습니다. CoroutineExceptionHandler는 사실 특별한 것이 아닙니다. (배워야 할 게 없다는 것은 아닙니다) 내부적으로는 Thread의 UncaughtExceptionHandler를 구현하는 것으로 작동하기 때문입니다. UncaughtExceptionHandler는 Thread에서 캐치되지 않은 Runtime Exception을 ..

    [Android/Kotlin] CoroutineContext이 구성요소들을 추가하는 방법

    CoroutineScope 변수를 만들 때, Job, CoroutineExceptionHandler, Dispatchers 등을 더하기 연산으로 합쳐서 만들어내곤 합니다. 이것이 어떻게 가능한 것인지 알아봅시다. Coroutine에 배정할 CoroutineContext 변수를 생성할 때, + (덧셈) 연산자로 원소들을 합치고는 합니다 1 2 3 4 5 6 7 open class ExampleViewModel: ViewModel() { protected val coroutineExceptionHanlder = CoroutineExceptionHandler { _, throwable -> throwable.printStackTrace() } protected val ioDispatchers = Dispatc..

    [Android] SingleLiveEvent의 원리

    SingleLiveEvent를 사용하는 이유를 설명할 수 있어야 한다. LiveData를 이용하다보면, View의 재활성화 (start나 resume 상태로 재진입)가 되면서 LiveData가 observe를 호출하여, 불필요한 Observer Event까지 일어나는 경우가 있습니다. 이를 방지하기 위해 기존 LiveData를 상속하여 만들어낸 것이 SingleLiveEvent입니다. (SingleLiveEvent에 대해 상세히 알고싶다면 - 링크) 일반적인 SingleLiveEvent 코드는 다음과 같습니다. import android.util.Log import androidx.annotation.MainThread import androidx.lifecycle.LifecycleOwner import..

    안드로이드 추천 오픈소스8) Time Line View

    https://github.com/vipulasri/Timeline-View vipulasri/Timeline-View Android Timeline View is used to display views like Tracking of shipment/order, steppers etc. - vipulasri/Timeline-View github.com 간지남 0. 한장 소개 1. 장점 최근까지도 계속하여 업데이트 되고 있음 Issue 처리가 굉장히 빠른 편임 RecyclerView 형태로 되어 있어 접근성이 용이함 색상, 줄 모양 등 커스텀이 편함 일단 Timeline 용도로 사용하기에 모자름은 딱히 보이지 않음 2. 단점 가이드라인이 조금 부족하여 원하는 커스텀은 약간의 공을 들여야함

    [Android/kotlin] List vs MutableList vs ArrayList vs LinkedList

    📌 List vs MutableList vs LinkedList vs ArrayList 🐳 List와 MutableList의 차이 Kotlin은 많은 변수들을 Mutable 여부로 나누고 있다는 것을 잊지말자. List Collcection에서도 List와 MutableList의 차이는 Read-Only인지 아닌지의 차이이다. 그러나, Compile Time에는 둘다 List로써 인식된다. 이는 MutableList가 List를 상속하여 만들어졌기 때문이다. 결국 둘 다 컴파일 결과로 java.util.List 이 된다. public interface MutableList : List, MutableCollection { ... } 🐬 MutableList와 ArrayList의 차이 MutableList..

    [Android] 생명주기 테스트

    📌 생명주기 테스트 생명주기를 여러 번 공부해왔고, 실전에서도 많이 사용해보았지만, 내 자신에게 '생명주기에 대해서 낱낱히 설명해 봐!' 라고 묻는다면, 늘 새로운 기분이 든다. 오늘은 약간이라도 애매한 부분을 확신으로 바꾸기 위하여 생명주기 테스트 프로젝트를 만들어 보기로 하였다 🧩 Test Case A Activity → B Activity → A Activity A Activity → Transparent Activity (배경이 투명한 투명 액티비티) → A Activity A Activity → B Activity → B Activity (singleTop) 테스트를 하는 생명주기들 enum class LifeCycleEx{ CREATE, RESTART, START, RESUME, PAUSE, ..

    [Android] Activity 좌우로 전환 애니메이션 적용하기

    📌 Activity 좌우로 전환 애니메이션 적용하기 안드로이드는 위 아래로 전환되는 애니메이션을 기본적으로 적용하고 있습니다. 이를 좌우로 전환시키도록 바꾸고 싶을 때, 아래와 같은 설정을 해주시면 됩니다. // in Activity override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) with(window) { enterTransition = Slide().also { it.excludeTarget(android.R.id.statusBarBackground, true) it.excludeTarget(android.R.id.navigationBarBackground, true) it.slideEdge ..