Android 18

Android 알람 만들기 (feat. Service, Broadcast Receiver)

이번 포스트에서는 Broadcast Receiver, Service를 이용해서 알람을 만드는 방법을 알아봅니다! 먼저 알람에 대해서 알아볼텐데요, 안드로이드 developer 사이트에 올라온 set Alarm을 보면, 알람을 설정할 때 몇가지 기준이 필요하다고 합니다. 정확한 시간에 울려야 하는가? vs 정확한 시간이 아니여도 괜찮은가? 반드시 정확한 시간에 울려야하는 알람이 아니라면, setRepeating() 보다는 setInexactRepeating()을 이용합니다! 왜냐하면, 정확한 알람 설정은 부정확한 알람 설정보다 많은 배터리를 소모하기 때문입니다! 지정한 시간에 울려야 하는가? vs 기기를 부팅한 후의 시간을 통해 울려야 하는가? 알람의 유형은 4가지가 있습니다! ELAPSED_REALTIM..

Android 2022.09.15

Drawble Selector를 이용한 Button 만들기

왜 기본 Button이 있는데, Selector? 우리가 일반적으로 사용하는 Button은 다양한 제약을 받으며, 이를 피하기 위해 Custom해서 사용해야 한다. 버튼 또는 이미지가 터치 됐을 때, 터치됐다는 느낌을 주고싶다면, 혹은 한 버튼의 현재 상태에 따른, 예를 들면 포커스 됐을 때, 체크 됐을 때, 선택 되었을 때 등 여러 상태에 따라 커스텀하고 싶을 때 Drawble Selector를 이용해서 만들면 편리하다. Drawble Selector 먼저 Drawble Selector를 이용해 이미지로 버튼을 클릭했을 때, 클릭하지 않았을 때의 이미지를 다르게 만들어보겠다. res/drawable 폴더에 클릭 됐을 때, 클릭이 안됐을 때(true와 false일 때) 이미지를 넣어준다. drawable..

Android 2022.09.14

LifecycleScope, ViewModelScope의 내부 구조

어느날 안드로이드 개발 단톡방에 이런 글이 올라왔다. CoroutineScope를 이용해 코루틴을 이용할 수 있지만, 위의 사진 처럼 Activity, ViewModel에 따라 각각의 Lifecycle에 맞추어 onCleared()시에 Coroutine의 작업을 취소시켜줄 수 있다. 이처럼 Coroutine의 Scope에는 상황에 맞는 Scope가 있는데, 이중 ViewModelScope, LifecycleScope에 대해서 차근차근 알아보자. 1. LifecycleScope 먼저 모듈수준의 build.gradle에 추가를 해준다. androidx.lifecycle:lifecycle-runtime-ktx:2.2.0 // 또는 그이상의 버전을 사용 LifecycleScope의 선언부이다. 설명을 읽어보면 ..

Android 2022.09.14

AAC ViewModel은 어떻게 onDestroy에서 살아남을 수 있었을까

1. AAC ViewModel이란? AAC ViewModel(이하 ViewModel)은 ViewModelStoreOwner의 수명주기를 인식하며, 화면 회전같은 configuration change에서 데이터가 생존할 수 있도록 해준다. 또한 목적에 따라 ViewModel, onSaveInstanceState, Persistent Storage를 적절히 이용해 데이터를 저장할 수 있도록 한다. 이는 저장소 위치, 시스템에서 프로세스 중단시에도 데이터 유지, 사용자가 액티비티를 완전히 닫거나 finish()등 에서도 데이터가 유지되는지에 따른 차이가 있으니 필요에 맞게 단독 또는 조합하여 사용해야 한다. ViewModel은 onSaveInstanceState나 Persistent Storage와는 다르게 ..

Android 2022.09.14

Fragment의 Lifecycle 잘 알고 있나요

서론 최근에 기본기를 다지다 보면서 Fragment의 Lifecycle에 대해서 다시 공부했었습니다. 그런데, 확실히 알고 나니 제 프로젝트에서 오동작하는 상황에서 어떠한 부분이 문제고, 어떻게 고쳐야 할지 빠르게 파악이 되고, 수정할 수 있는 "힘"이 생기는 것 같습니다. 저의 프로젝트에서 문제 상황을 먼저 보고, Fragment Lifecycle을 공부한 뒤, 해결해보는 시간을 가져보겠습니다. 문제 블로그 주인 seokzoo는 RecyclerView를 이용해 유저의 List를 LinearLayout 형식으로 보여주고 있다. 대세에 따라 Single Activity, Mutiple Fragment를 구현해주었고, RecyclerView를 보여주는 UserListFragment와 아이템을 클릭시에 상세 ..

Android 2022.09.13

AAC ViewModel 따라가기

서론 이번 포스트에서는 ViewModel을 사용은 하지만, 내부동작은 어떻게 이루어지는가에 대해서 잘 모르는 사람들을 위해 알아보려고 합니다(저포함)! 보통은 그냥 by viewModels()를 이용해 사용하는 방법만 알 뿐, 그 안에서는 어떤식으로 동작하는지는 크게 신경쓰지 않습니다. 그럼 이제 ViewModel에 대해서 먼저 알아본 뒤, 하나하나 따라가보겠습니다! 다만 이 포스트는 viewModels의 기본 사용법이므로, 아래와 같이 viewmodelFactory는 따로 만들어주지 않았습니다. viewModelFactory를 넣어주는 예시 private val githubViewModel: GithubViewModel by viewModels(factoryProducer = { GithubViewMo..

Android 2022.09.13

Coroutine과 Retrofit을 같이 사용하면 enqueue를 쓰지 않아도 되는 이유는?

이 포스팅을 작성하는 이유 안드로이드를 처음 접할 때 retrofit을 이용해 서버와 통신할 경우 아래와 같은 코드를 작성하게됩니다. interface UserApi { @GET("api/") suspend fun getUserList( @Query("page") page: Int, @Query("results") results: Int, @Query("seed") seed: Int, ): Call } ... NetworkManager.UserApi .getUserList(page, MainActivity.USER_COUNT, seed) .enqueue(object : Callback{ override fun onResponse(call: Call, response: Response) { // 통신 성공..

Android 2022.09.13

RecyclerView ListAdapter를 통한 DiffUtil 사용법

안드로이드 개발을 한다면 가장 많이, 자주 쓰이는 것들 중 하나가 RecyclerView일것이다. 이번 포스팅을 기회로 완벽하게 정리해두고 기억이 안나거나 참고할 때 볼 수 있도록 해야겠다. 1. 먼저 RecyclerView란? ListView는 스크롤하여 리스트 항목이 갱신될 때마다, 매번 아이템뷰를 새로 구성해야 했다. 하지만 리사이클러뷰는 이름 그대로 생성한 뷰를 "재활용"한다. 만약 10개의 리스트를 보여준다고 한다면 대략 17~20개정도의 뷰홀더 객체를 만든 뒤 사용자의 화면에서 벗어나는 경우 맨 위의 뷰가 다시 재활용(Recycle)되어 맨 밑으로 가 뷰의 데이터들이 bind된 뒤 다시 보여지게 된다. 2. RecyclerView를 구현하는데 필요한 요소 0.1 사용할 프래그먼트 or 액티비티..

Android 2022.09.13