프로그래밍/Android 140

[안드로이드] 앱이 버벅거리지 않게 하기 위해서 해야할 일

앱이 버벅댄다는건, 60FPS가 나오지 않는 상태를 의미한다. 16ms마다 그리기를 완성해야하는데 작업량이 많아 그것보다 시간이 더 걸리게되면 사용자가 알아채기 시작한다. 버튼이 그려지기까지의 과정 버튼같은 UI 오브젝트들은 먼저 CPU에의해 폴리곤(Polygon)과 텍스쳐(Texture)로 변환되어야한다. 이 변환 작업도 시간이 많이 걸리며(time-consuming), 이들을 CPU에서 OpenGL ES API를 통해 GPU로 업로드하는 작업도 시간이 많이 걸린다. GPU는 이들을 픽셀로 바꾸어 스크린에 보일 수 있게 만든다. 이 작업을 래스터화(Rasterization)라고한다. GPU로 올라간 메쉬(mesh)는 곧바로 사라지지않고, GPU에 머물게되고 나중에 사용할 일이있을때 재사용하게 된다. 메..

[안드로이드] V3 구글 인앱 결제 쉽게 구현하기 2021 - 정기결제 구독 상품편

Quick Links 강의 1 편 - 설정 강의 2편 - 인앱상품 강의 3편 - 구독상품 Github 예제 코드 이번에는 정기결제 상품 인앱 결제를 구현해 보도록 하겠습니다. 어떤 앱을 만들게 될지 짧은 동영상으로 먼저 보시죠! 아래 기능들을 구현해볼겁니다. - 정기결제 상품 정보 표시 - 정기결제 상태 확인 - 정기결제 업그레이드, 다운그레이드 - 정기결제 하기 구현에 앞서 참고 사항 라이브러리 구성과 같은 부분은 이전 인앱 결제하기 포스팅에서 따라하시고 오시면됩니다. 그 밖에 결제모듈에 대한 설명들도 모두 여기에서 하고있으니 이 포스팅을 보셨다는 가정하에 글을 쓰도록 하겠습니다. 화면 구성 화면쪽은 역시 빠르게 넘어가도록 하겠습니다. activity_subscription.xml Subscriptio..

[안드로이드] V3 구글 인앱 결제 쉽게 구현하기 2021 - 인앱 상품편

Quick Links 강의 1 편 - 설정 강의 2편 - 인앱상품 강의 3편 - 구독상품 Github 예제 코드 이제 인앱 상품 결제를 구현해 보겠습니다. 정확히 어떤 앱이 만들어질지 직접 동영상으로 확인 해 보세요! 1회성 구매 파트가 이번 포스팅 파트입니다. - 광고제거, 크리스탈 충전 상품정보를 받아와서 화면에 표시 - 광고제거 구매, 구매여부 체크 - 크리스탈 구매, 크리스탈 충전 구현에 앞서 참고사항 예제 코드들은 Kotlin으로 되어있으며, 비동기 처리에 Coroutine을 사용하기도 합니다. 하지만 Coroutine을 사용하지 않고 콜백형식으로 구현하는 방법도 간단히 설명드릴 예정입니다. (Kotlin과 Java의 전환이 어려우시다면 제 예전 글을 참조하셔서 Kotlin을 빠르게 배워보세요!..

[안드로이드] V3 구글 인앱 결제 쉽게 구현하기 2021 - 설정편

Quick Links 강의 1 편 - 설정 강의 2편 - 인앱상품 강의 3편 - 구독상품 Github 예제 코드 최근에 Google Play로 부터 아래와 같은 내용의 메일을 받으신 분들이 있을겁니다. 옛날 버전의 결제 모듈을 사용하고 계시다면, 이번 기회에 저와 함께 따라하면서 바꿔보세요! 앱이 이전 버전의 Google Play 결제를 사용하는것으로 확인되었습니다. 2021년 11월 1일까지 모든 앱 업데이트가 결제 라이브러리 버전 3 이상 을 사용해야 합니다. 이 날짜 이전에 결제 라이브러리 버전 3로 업데이트하시기 바랍니다. 이번 편은 "설정편"입니다. Google Play에 앱을 등록하고, 결제 테스트가 가능하도록 설정하는 과정이 여기에 포함됩니다. APK 업로드 이전, APK 업로드 이후 부분으..

[안드로이드] WebView에서 세션 쿠키 활성화 하기 (소셜 로그인)

다른 곳에서 개발한 웹을 웹앱으로 만들다가 소셜 로그인이 안되길래 이곳 저곳 찾아보았다. 실제 브라우저에서 로그인 과정 (1) 네이버로 로그인하기 클릭 (2) 현재 창에서 팝업이 떠서 네이버 로그인 (3) 팝업이 닫히고 로그인 완료 앱 내에서 로그인 과정 (1) 네이버로 로그인하기 클릭 (2) 네이버 로그인 페이지가 열림 (3) 창이 닫힘, 로그인 페이지가 다시 보임 webView.setSupportMultipleWindows(true)가 되어있지만 팝업이 뜬다는 신호는 오지 않았다. 직접 컴퓨터 브라우저로 실행해보니 동일 증상은 '다른 탭에서 열렸을때' 발생했다. 해결방법은 다음과 같다. webViewClient = object: WebViewClient() { override fun shouldOve..

[안드로이드] Context 사용 범위 정리

오늘도 LeakCanary에서 메모리를 모니터링하다가.. 해결방법을 찾던 중 좋은 글을 봤다. 적절한 Context의 사용은 GC가 제대로 동작하게 만들어 Memory leak을 예방할 수 있다. 표 출처: sodocumentation.net/android/topic/2687/memory-leaks Application Context Activity Ctx. Service Ctx. ContentProvider Ctx. BroadcastReceiver Ctx. Dialog 보여주기 X O X X X Activity 시작 X O X X X Layout Inflation X O X X X Service 시작 O O O O O Broadcast 전송 O O O O O BroadcastReceiver 등록 O O..

[안드로이드] Nested RecyclerView 구현시 스크롤 문제 해결하기

Horizontal, Vertical 방향이 혼재된 Nested RecyclerView를 구현하다 보면 세로 스크롤을 하는 도중 가로 스크롤로 넘어가는데 자연스럽지 않거나 그 반대 상황이 생긴다. 그럴때 기본 RecyclerView 대신 아래의 커스텀 RecyclerView를 사용하면 조금 더 자연스러워 진다. 간단하게 주석으로 무슨일을 하는지 적어두었다. 원 코드 출처는 여기이다. public class OrientationAwareRecyclerView extends RecyclerView { private float lastX = 0.0f; private float lastY = 0.0f; private boolean scrolling = false; public OrientationAwareRec..

[안드로이드] 에뮬레이터 감지 하는 법 (Detecting Emulator Device)

framgia님의 Android Emulator Detector [https://github.com/framgia/android-emulator-detector] 를 약간 수정해서 안드로이드 에뮬레이터를 판별하는 클래스를 만들어서 공유하려한다. 지원 Emulator 테스트가 끝난 Emulator들은 다음과 같다! LD Player NOX Bluestacks Genymotion MEmu KoPlayer GameLoop NetEase MuMu Player Andy Telephony 정보를 받지않고도 거를 수 있는데, 이건 Architecture가 x86이나 i686 기반으로 되어있으면 걸러버리기 때문이다. 하지만 이때문에 인텔 칩셋을 사용하는 휴대폰은 실제 디바이스임에도 불구하고 걸려버리는 수가있긴하다. (..

[안드로이드] RecyclerView를 잘 사용하기 위한 팁들.

ListView가 널리 쓰일때부터 RecyclerView, 그리고 지금은 DiffUtil을 이용한 ListAdapter를 사용하기 까지! 수 년간 안드로이드를 개발해왔는데, RecyclerView에 대해서 계속 당하기만 한 기억뿐이다. 잘몰라서 그렇다. 그래서 이번에 RecyclerView에대해서 공부 할 거리를 찾아보다 발견한 짧은 글을 간단히 번역해 보기로 했다. 원문: proandroiddev.com/recyclerview-pro-tips-part-1-8a291594bafc 1. 런타임에 RecyclerView 내의 아이템 크기가 변하지 않는다면 setHasFixedSize(true)를 사용해라. RecyclerView 내의 아이템의 높이가 모두 균일하다면 RecyclerView.setHasFixe..

[안드로이드] 예제로 알아보는 바인드된 서비스 (Bound Service)

바인드된 서비스(Bound Service)는 서비스와 다른 안드로이드 컴포넌트들 (Activity, Fragment, Service)간에 서버와 클라이언트같은 관계를 구현할 수 있어 IPC(프로세스간 통신)를 가능하게 한다. 이번에 이를 이용해서 구현할 예제는 앱의 설치상황을 관찰하는 서비스이다. 게임 다운로드 버튼을 누르면, 구글 플레이가 실행되고 구글플레이 설치 진행 상황에 따라 버튼 상태가 바뀐다. Bind Service의 작동원리와 개념은 코드와 함께 보자! 서비스 만들기 설치 상태를 관찰 할 서비스는 InstallStateService이다. 먼저 Binder를 하나 만들어 주어야하는데, binder를 통해서 다른 앱 컴포넌트에서 이 서비스에 접근 할 수 있게 된다. class InstallSta..