Android 공부

    시간표 어플리케이션 개발 회고록

    1. 시작 2017년, 다이어리 어플리케이션을 만들게 되었다. 담아두다라는 어플리케이션은 일정, 단어상자, 일기장, 사진저장소라는 다양한 복합 저장소 어플리케이션으로 만들어졌다. 하지만, 계속해서 정체되고 어플리케이션의 다운로드 수가 증가하지 않았고, 애드워즈를 하면서 어플리케이션을 홍보하기 시작했지만, 정말 아무 효율성이 없었다. 2. 앱을 만능으로 만들기보다는 컨셉을 갖고 있는 앱으로 만들자. 처음에 만든 앱은 별의 별 기능이 다 있는 앱이었다. 뭐라고 설명하기 힘들었고, 이것도 되고, 저것도 되고 다양한 기능들로 다양한 서비스를 제공하려는 욕심이 가득했었다. 하지만, 내가 만든 앱을 주변 지인들에게 얘기하려고 할 때, 만들고 있는 앱은 이러이러한 앱이다라는 설명을 할 수 없었다. 그래서, 담아두다를..

    Android Worker - 매일 알람 만들기

    0. WorkManager를 어떨 때 사용해야 할까? 최근 '담다' 앱에서 WorkManager를 도입했다. '담다'앱은 시간표 앱이기에 유틸리티의 느낌이 강하게 띄고 있다. 그래서, 앱의 큰 장점이 있다면, 별도의 서버를 호출하지 않고, 앱의 많은 기능이 유연하게 돌아가서 클라이언트의 기능에만 집중할 수 있다는 장점을 갖고 있다. 또한, 대부분 WorkManager를 사용하는 이유는 안드로이드의 백그라운드 정책을 유연하게 대응하기 위해서이다. 도즈모드, 서비스 제한, 앱버킷, 배터리 세이버등의 제한 정책 속에서 안전하게 백그라운드 작업을 하기 위해서는 WorkManager가 가장 제격이기 때문이다. 여튼, 그래서 WorkManager를 도입해서 '담다' 앱에서는 어떤 것을 얻었을까? - 특정 시간, 사..

    인앱결제 - 구매후 생각해야 할 것

    1. 구매후 로직이 필요했다. 이전에 올린 글을 통해서 billing을 2개월 동안 오픈했는데, 사람들이 구매하자마자 계속해서 환불을 했다. 이게 우연의 일치겠지라고 생각을 했는데, 대략 6명 정도가 그랬고, 내 돈이 하늘나라로 날아가는 것을 봐야만 했다. 그래서 코드에 문제가 없는게 아닐까 의심을 하기 시작했다. onPurchaseUpdate에서 handlePurchase(purchase) 로직을 처리해야 했다. override fun onPurchasesUpdated(billingResult: BillingResult?, purchases: MutableList?) { if (billingResult?.responseCode == BillingClient.BillingResponseCode.OK &&..

    안드로이드 인앱결제 - 구매 로직

    안녕하세요!- '담다' 시간표를 개발하는 감자튀김입니다. 개인 개발을 하면서 광고를 보여주기에는 UI/UX가 불편할 것 같고, 어떻게 하면 좋을까? 하다가 '인앱결제'로 광고제거를 하면 좋겠다라는 생각으로 인앱결제 기능을 만들기 시작했습니다. 안드로이드 개발자 사이트(https://developer.android.com/google/play/billing/billing_library_overview?hl=en)에서는 이와 같이 친절하게 알려주고 있습니다만, 봐도 모르는게 초보 개발자의 특징이겠죠. 그래서, 이렇게만 하면 된다는 한글 가이드가 필요할 것 같아서 짧게 블로그 씁니다. 0. 종속성부터 추가하자. 깔끔하게 종속성을 부여해줍시다. 1234dependencies { ... implementation..

    RecyclerView in SwipeRefreshLayout with CoordinatorLayout

    1. 고민 고민- NestedScrollView가 싫다.- 그래서, Coordinator Layout을 통해서 다양한 뷰와 리사이클러 뷰의 성능상 이점을 갖는 구조를 만들었다.- 새로 고침 기능이 필요해졌다.- SwipeRefreshLayout이 필요하다. - SwipeRefreshLayout은 CoordinatorLayout에서는 어떻게 사용할까?- RecyclerView의 behavior는 어떻게 해야할까? 지난 글과 같이, NestedScrollView를 사용하지 않고, 리사이클러뷰에 다양한 뷰홀더를 만들어서 뷰 구조를 잡았다.그 과정에서, CoordinatorLayout을 이용해서 리사이클러뷰의 재활용과 백드롭 등, 다양한 이점을 가져오고 있었다. 그리고, 새로 고침 기능이 필요해졌다. 그러면 어..

    NestedScrollView 없이 RecyclerView를 사용해보자.

    0. 요약- 최근 고민은 리사이클러뷰의 재활용과 함께, NestedScrollView를 사용하지 않고, 뷰 구조를 잡기 위해서 고민을 했다.- 고민 끝에, Coordinator Layout 내부에 각종 View를 셋팅하게 되면, 리사이클러뷰의 구조를 살린채, 레이아웃 구조를 잡을 수 있을 것이라고 생각을 했다.- 하지만, Coordinator Layout에서 자유롭게 사용되어지는 뷰는 behavior를 받는 뷰 뿐만이 자유롭게 움직일 수 있다는 것을 알았다.- 그래서, 리사이클러뷰를 만들고, 어댑터에 여러 개의 뷰홀더를 만들어야만 해결이 된다는 것을 알게 되었다.1. NestedScrollView & RecyclerView- 리사이클러뷰의 장점은 뷰홀더를 통해서 뷰를 재활용해서, 앱의 퍼포먼스를 향상시키..

    서울시 공공데이터 API를 활용한 Paging Library 사용하기 - 2

    0. Paging- Data : Room 혹은 Retrofit과 같은 라이브러리를 이용해서 데이터를 가져오면 된다. Paging 라이브러리는 만능이라기 보다는, 정형화된 틀을 제공해주는데, Data를 가져오는 부분에서도 사용자는 Paging의 규격에 맞게 데이터를 가져올, 인터페이스를 형성해야 한다. 예를 들면, 10개씩 데이터를 가져와서 리스트에 보여준다고 할 경우에는, getFetch(startIndex, endIndex)와 같이 틀을 만들어줘야만 한다. 그렇게 되면, PagedKeyedDataSource를 통해서 loadInitail(), loadBefore(), loadAfter()로 관리할 수 있다.- PagedList : PagedKeyedDataSource를 통해서 데이터를 획득하면, cal..