Compose-Lottie 애니메이션 동작 후, Intent로 Activity 전환하기 저는 평소에 Splash Activity를 별도로 Custom 하게 생성 후, Lottie 애니메이션을 포함시켜 구성하는 형태를 많이 사용했었습니다. 그러다 보니 Compose를 공부하면서 똑같은 형태를 구현해 보게 되었네요. 앱 실행 시 기본 네트워크 및 DB 처리가 완료되는 시간을 5초로 간주하고 Lottie 애니메이션이 그동안 동작하고 MainActivity로 넘어가는 구조를 설명하겠습니다. 먼저 Lottie 홈페이지에서 모션 이미지를 선택하여 JSON 형태의 데이터를 다운로드합니다. 이후, res - raw 폴더를 생성하여 해당 폴더에 다운로드한 Lottie 파일을 삽입합니다. 다음, Custom Splash ..
Development/Android
안드로이드 스튜디오 와이파이 활용 무선 디버깅 연결 방법 안드로이드에서 무선 디버깅으로 유선 필요 없이 연결하는 방법을 소개해보겠습니다. 안드로이드 스튜디오는 최신 버전으로 유지해야 합니다. OS 버전은 Android 11 이상이어야 한다고 확인됩니다. https://developer.android.com/studio/run/device?hl=ko#wireless 하드웨어 기기에서 앱 실행 | Android 스튜디오 | Android Developers Android 디버그 브리지(ADB) 연결을 통한 테스트 및 디버깅을 위해 개발 환경 및 Android 기기를 설정하는 방법을 알아보세요. developer.android.com 먼저 설정 - 개발자 옵션을 활성화해야 합니다. 이제 목록에 '무선 디버깅'..
Room DB 기본 설정 후, 데이터 저장 및 가져오기 Room DB 살펴보기 사내 서비스에서 기존에 사용하고 있던 Database가 SQLite, Realm DB 두 가지 종류였는데, 이번에 새로운 테이블 구성이 필요해서 Jetpack에서 제공하는 Room DB를 사용해 봤다. https://developer.android.com/training/data-storage/room?hl=ko Room을 사용하여 로컬 데이터베이스에 데이터 저장 | Android 개발자 | Android Developers Room 라이브러리를 사용하여 더 쉽게 데이터를 유지하는 방법 알아보기 developer.android.com Room DB를 그냥 사용하려는 것은 아니고, 당연히 SQLite보다 장점이 있기에 사용하게 ..
앱 테스트 진행 중에 다음과 같은 Exception이 발생했다. Fatal Exception: java.util.ConcurrentModificationException 여러 스레드에서 하나의 컬렉션에 접근할 때, 동시성 문제가 발생하는 것으로 확인된다. 문제가 발생한 코드로 이동해 보니... object DataManager { private var dataInfos = ArrayList() ..... object Manager 내부의 dataInfos라는 리스트가 있고, 해당 DataManager가 외부에서 여러 스레드에 동시 호출되며 dataInfos에 접근하던 중 문제가 발생하는 것으로 확인했다. 싱글톤 하위 리스트를 여러 스레드 접근에 안전하도록 처리할 필요가 있었다. object DataMan..
System 상에서 현재 애플리케이션을 완전히 종료시키는 로직 fun killApp(activity: Activity) { ActivityCompat.finishAffinity(activity) exitProcess(0) } 1. ActivityCompat.finishAffinity(activity) : 주어진 Activity와 해당 Activity 위에 쌓인 모든 Activity를 종료 2. exitProcess(0) : 현재 프로세스를 종료. 0은 정상 종료를 의미하는 코드 값
사용자의 앱이 최신 버전인지를 판단하여 필요에 따라 플레이스토어에서 업데이트를 요구할 수 있는 로직이 필요했다. 마침 Android에서 제공하는 AppUpdateManagerFactory가 존재했다. https://developer.android.com/reference/com/google/android/play/core/appupdate/AppUpdateManagerFactory AppUpdateManagerFactory | Android Developers Stay organized with collections Save and categorize content based on your preferences. AppUpdateManagerFactory public final class AppUpdat..
사용자에게 좀 더 신속한 데이터 갱신 처리를 제공하기 위해 백그라운드 동기화 처리를 구현하기로 했다. Jetpack에서 지원하는 WorkManager를 사용해 보기로 했다. 먼저 build.gradle에 다음 설정을 추가해준다. implementation "androidx.work:work-runtime-ktx:2.8.1" 그리고 작업 정의를 위한 Worker 클래스를 생성한다. class SyncWorker(val context: Context, params: WorkerParameters) : Worker(context, params) { override fun doWork(): Result { syncAndCallApi() return Result.success() } } doWork 내에서 비동기..
사용자가 프로필 사진을 변경하기 위해 갤러리에서 사진을 선택해 가져오는 로직이 노후화되어 전체적으로 재구성했다. registerForActivityResult를 활용했다. https://developer.android.com/training/basics/intents/result?hl=ko 활동에서 결과 가져오기 | Android 개발자 | Android Developers 활동에서 결과 가져오기 컬렉션을 사용해 정리하기 내 환경설정을 기준으로 콘텐츠를 저장하고 분류하세요. 앱 내에서든 다른 앱에서든 다른 활동을 시작하는 것은 단방향 작업이 아니어도 됩 developer.android.com 먼저 갤러리로 진입할 수 있는 로직을 작성한다. val permissions = if (Build.VERSION...
Android에서 비동기 처리를 위해 많이 사용되던 AsyncTask가 deprecated 되었는데, 프로젝트에 아직도 사용되는 부분들이 존재하여 Coroutine을 활용하여 비동기 처리하도록 수정을 진행했다. public class CheckApiTask extends AsyncTask { @Override protected void onPreExecute() { super.onPreExecute(); //Task 실행 전 UI 작업 } @Override protected Boolean doInBackground(String[] params) { try { //Background 작업 } catch (Exception e) { e.printStackTrace(); } return false; } @Ov..
안드로이드에서는 위치, 외부 저장소 등의 접근을 위해 사용자에게 시스템 다이얼로그 직접 접근 권한 허가를 받아야 한다. 최근 Android 13부터는 알람까지 접근 권한을 받아야 활성화되는 것으로 변경되었다. 하지만 사용자들이 매번 허용한다고 보장할 수 없다.. 접근 권한 허가 요청을 2번 이상 거부 당하거나 과거 OS 버전처럼 다시 보지 않음을 체크하여 거부할 경우, 사용자가 특정 기능 사용을 영구적으로 제한받을 수 있다. 실제로 위와 같은 이유로 특정 기능이 안 된다는 사용자 리포트가 들어와 재설치를 안내하고, 권한 허가를 요청드린 경우가 있었는데, 이런 비용 낭비 시나리오를 대응하기 위해 영구적으로 권한 접근을 거절당하더라도 안내 Dialog를 통해 사용자가 직접 권한 설정을 변경할 수 있는 로직을..