Android

    Android 12 이상 SplashScreen 대응하기 (올바른 SplashScreen 구현하기)

    SplashScreen의 구현에 앞서, 우선 Splash가 왜 필요할까? 기본적으로 모든 앱은 실행하면 사용자에게 보여주기까지 데이터를 불러오는 시간이 필요하다. 앱이 실행되는 상태에는 Cold Start, Warm Start, Hot Start 총 3가지가 존재하며, Cold와 Warm 상태일 때 앱을 준비하는 시간이 필요하다. (앱의 실행상태 3가지에 대해 자세한 설명은 이곳 에 설명이 잘 돼있으니 참조하자.) Splash 화면이 없을 때의 앱 실행 모습을 보자. Hello World라는 TextView를 가지고 있는 최초의 View를 보여주기 전에, 앱을 실행하기 위한 준비를 하는 시간(앱 객체 생성, 메인 스레드 시작, 액티비티 초기화, 뷰 붙이기 등)이 필수적으로 존재할 수밖에 없다. 때문에 이..

    안드로이드 프로젝트 Multi Module로 빌드시간 줄이기 (data, repository 계층 분리)

    개발을 주로 집에서 데스크탑으로 하고, 또 데스크탑 성능이 좋은편이라 기존에 개발할 때에는 몇몇 테스트를 제외하곤 주로 안드로이드 스튜디오에 내장된 에뮬레이터를 이용하는 경우가 많았다. 그러나 이번에 실 배포용으로 앱을 만들려다 보니 에뮬레이터가 아닌 실기기로 테스트하는 경우가 굉장히 많아졌는데, 에뮬레이터와 다르게 앱을 빌드하고 인스톨 하는 시간이 생각보다 꽤 오래 걸렸다. 이게 생각보다 많이 불편했던지라 인스톨 시간은 어쩔수 없다고 쳐도 최소한 빌드 시간이라도 줄이고 싶다는 생각으로, 평소에 말만 들어왔던 모듈화를 해보기로 하였다. 모듈로 만들 수 있는것에는 다양한 것들이 있겠으나, MVVM 아키텍쳐에서 좀 더 확실한 관심사 분리를 위해 Repository와 Data 파트를 모듈화 해보기로 결정하였다..

    Hilt의 다양한 어노테이션 - @Provides, @Binds, @Qualifier

    Hilt는 일반적으로 다음과 같이 생성자 주입 방식을 사용한다. @AndroidEntryPoint class ExampleActivity : AppCompatActivity() { @Inject lateinit var analytics: AnalyticsAdapter ... } class AnalyticsAdapter @Inject constructor( private val service: AnalyticsService ) { ... } 그러나 Hilt에서 생성자 주입을 할 수 없는 경우 Hilt 모듈을 만들어서 종속성을 주입해야 하며, 이 때 상황에 따라 @Provides와 @Binds 어노테이션을 사용할 수 있다. @Provides를 사용하여 인스턴스 주입 Room이나 Retrofit, OkHttp..

    Channel을 이용하여 팝업 메세지 구현하기 ( send & trySend )

    서버를 통해 FCM으로 데이터를 보내면, 클라이언트에서 해당 데이터를 Channel에 넣고, view에서 Channel에서 데이터를 꺼내와 팝업 레이아웃을 보여주는 기능을 구현하려고 하였다. 그러나 데이터가 들어오는것을 전부 팝업으로 띄울 수는 없다고 생각했고, (데이터가 계속해서 넘어오면 처리속도보다 발행속도가 빨라 매우 오래 처리하게 되므로) Channel에 버퍼를 할당하면 되는 것이라 생각했다. 일단 팝업 메세지를 관리할 Channel을 만들고 capacity를 할당하였다. class MessageChannel { val channel = Channel(capacity = 3) suspend fun sendToChannel(title: String?, message: String?) { val da..

    Android MVVM + DI(Hilt) 적용하기

    2020년 말 ~ 2021년 초에 안드로이드 MVVM 관련하여 포스팅한적이 있으나 다음과 같은 이유들로 새롭게 포스팅한다. deprecated된 코드가 존재하며 코틀린과 자바가 혼재해 있다는 점. 당시에는 완전 처음 배우는 개념이다보니 설명 자체가 매우 미흡하다는 점. MVVM in Android CleanArchitecture 로버트 C 마틴에 의해 고안된 프로그래밍 철학 핵심 골자는 각 소프트웨어의 '관심사분리' MVC Model, View, Controller로 이루어지는 디자인 패턴 컨트롤러는 사용자의 입력을 받아 모델에 데이터를 요청, 받아서 뷰에 데이터를 전달, 뷰에서 UI의 변화가 일어난다. 예를들어 버튼을 누르면 현재 시간을 보여주는 프로그램을 구현할 때, 버튼을 클릭하면 컨트롤러는 이를 ..

    WorkManager에 Hilt를 이용하여 의존성 주입하기

    WorkManager에 Hilt로 의존성 주입하기 안드로이드 Sunflower 코드를 뜯어보며 공부하던 중, Room에 초기 데이터를 채워주기 위해 사용하는 WorkManager를 사용하는데에 문제가 있었다. Sunflower에서는 Room DB를 생성한 후, 필요한 곳에서 instance를 호출하여 사용하는 구조였으나, 본인은 의존성을 주입할 때 Singleton으로 생성하여 주입하는 식으로 코드를 작성하였기 때문에, WorkManager 내부에서 Room DB를 사용하기 위해선 주입을 받아 사용해야했다. 그러나 일반적으로 WorkManager는 기존에 제공하는 패러미터를 제외하고는 사용할 수 없다. 추가로 패러미터를 넣을 경우 다음과 같은 에러가 호출된다. java.lang.NoSuchMethodEx..

    startActivityForResult Deprecated

    startActivityForResult(SearchActivity.newIntent(this@PostArticleActivity), REQUEST_CODE)​ override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { super.onActivityResult(requestCode, resultCode, data) if(resultCode != Activity.RESULT_OK) return when (requestCode) { REQUEST_CODE -> { data?.let { (...중략) } } ?: kotlin.run { Toast.makeText(this, getString(R.string.loadError..

    업적 기능 UI 구현

    업적 기능 UI 구현

    문제 상황 서버에서 데이터를 보내면 안드로이드에서 service를 통해 데이터를 받고, BroadCastReceiver를 통해 해당 데이터를 처리하여, 화면에 '순서대로' 보여주어야 한다. 그러나 서버에서 데이터가 '동시에', '여러개'가 들어오면 제일 처음의 데이터만 나오고 뒤의 데이터들은 나오지 않는 상황이었다. (정확히는 동시에 ui 애니메이션 로직을 호출하여, 앞의것에 전부 가려져있는 상황) 자체적으로 Queue를 만들어서 해결하려 하였으나, 비동기작업을 하는 코루틴블록 함수가 메세지가 동시에 들어오면, 동시에 실행되기 때문에 일종의 원자성을 해쳐 원하는 결과를 얻기 힘들었다. 또한 다수의 코루틴 블록의 경우 join이나 await등으로 순서등을 조정할 수 있지만, 지금은 하나의 코루틴블록을 동시..