본문 바로가기

전체 글

(30)
[Android] 다른 앱 사용기록 조회 개요 사용자가 모바일에서 다른 어떤 앱을 얼마나 자주 사용하는지 모니터하는 서비스 여기서 제공하는 API를 사용하면, 최근 실행된 앱이 무엇인지, 사용시간은 각각 얼마인지 알 수 있음 (UsageStatsManager) 기간별 앱들의 네트워크 사용량을 알 수 있음 (NetwordStatsManager) 앱들의 저장공간을 알 수 있음 (StorageStatsManager) 권한 다른 앱들의 사용기록 정보를 얻기 위한 권한 PACKAGE_USAGE_STATS 필요함 (직접 요청 O) 1. UsageStatsManager 앱 사용기록을 Query 할 수 있는 API를 제공 조회하고자 하는 기간을 설정 (ex. 2020.04.01 - 2021.04.01) 시간 단위(Interval) 설정 (ex. days, w..
[Android] LiveData LiveData는 관찰 가능한 데이터 홀더 클래스로 Activity 나 Fragment 등 앱 구성요소의 수명주기를 인식하여 동작한다. 저는 비동기적인 작업(Corouintes + Flow)을 수행 시 주로 사용하며 완료 상태에 따라 UI의 데이터 업데이트에서 Activity 나 Fragment 또는 two-way binding을 통한 xml에서 직접 LiveData를 통한 Observing을 적용하고 있습니다. LiveData 특징 UI(Activity, Fragment)와 데이터(ViewModel)의 상태 일치를 보장 Observer 패턴을 따르 데이터라 변경될 때마다 관찰자에게 알림 LifeCycle를 통해 결합하므로 메모리 누수가 없음 구성 변경 시 최신 데이터를 받아옴 LiveData 사용법 A..
[Android] Activities and Intents 이번 글에서는 인텐트의 유형에 따라 사용하는 방법들을 다루어 보겠습니다. 명시적 인텐트를 사용하여 특정 Activity로 이동하는 방법 암시적 인텐트를 사용하여 다른 앱의 콘텐츠로 이동하는 방법 Intent 소개 Intent는 메시징 객체로, 앱 간 통신이나 컴포넌트 간 상호 작용을 위해 사용되는 객체입니다. 주로 Activity, Service, Broadcast Receiver, Content Provider의 컴포넌트 간에 데이터를 전달하거나 작업을 실행하는데 사용됩니다. 두 가지 유형으로 나뉩니다. Explicit(명시적) Intent : 매우 구체적이며 실행할 Activity를 정확하게 알 수 있고 자체 앱의 화면인 경우 Implicit(암시적) Intent : 좀 더 추상적이며 다른 앱이 관련..
[Android] Logger 라이브러리 확장하여 로그 파일로 저장하기 개요 안드로이드 개발을 하며 디버깅을 위한 로그 확인에서 나아가, 실제 사용자가 애플리케이션을 사용하며 생긴 이슈는 어떻게 확인할 수 있을까요? 방법은 바로 이슈 발생 가능성이 있는 로직에 로그를 작성하고 파일로 저장하여 개발자가 직접 확인하는 것입니다. Log 확인을 위해 Logger 라이브러리를 사용하였고, Logger 라이브러리 소개 문서를 확인하시면 도움이 됩니다. 하지만 로그를 파일로 저장하기 위해 공식 문서와 해당 소스코드를 확인해 보니 몇 가지 제약사항이 있었습니다. 첫째는 로그 파일은 앱 외부 디렉터리에 저장되고(저장 위치 변경 불가), 둘째는 고정된 500K의 파일 크기를 변경할 수 없다는 점이었습니다. 그래서 오픈소스인 Logger의 저장 관련 코드(Java)를 참고하여 확장 가능한 새..
[Android] 깔끔한 Log를 사용하여 생산성 향상하기 개요 개발을 하며 중간중간 디버깅을 위해 로그를 작성하여 Android Studio의 Logcat을 통해 확인하곤 합니다. 안드로이드에서 기본으로 제공하는 android.util의 Log를 많이 사용하는데, 로그 작성을 위해 별도의 태그를 지정해야 하고 해당 로그의 구체적인 정보를 포함하지 않습니다. 그래서 로그를 깔끔하고 보여주고 로그의 구체적인 정보를 출력하는 Logger 라이브러리를 소개하고자 합니다. 우선, 안드로이드에서 기본으로 제공하는 Log와 Logger 라이브러리를 통해 출력되는 로그를 비교해 봅시다! Log.d(tag, "Hello HomeFragment!") Logger.d("Hello HomeFragment!") 예시로 HomeFragment에서 "Hello HomeFragment!"..
[Android] RecyclerView를 사용해야 하는 이유 (feat. ListView) 안드로이드에서는 ListView 또는 RecyclerView를 사용하여 데이터 목록을 스크롤 가능한 리스트 형태로 화면에 보여줄 수 있다. ListView vs RecyclerView 먼저 간단한 특징과 차이점을 알아보자. ListView : 데이터 목록을 스크롤(세로 방향만 가능) 형태로 화면에 보여주는 가장 기본적인 방법 RecyclerView : 대량의 데이터 목록을 재활용 가능한 형태로 화면에 효율적으로 보여주는 방법 (ViewHolder 패턴 사용) ViewHolder란, 데이터 목록 중 개별 항목을 보여주기 위한 뷰를 가지고 있는 객체 두 방법 모두 Adapter를 통해 개별 항목의 뷰를 바인딩 하여 화면에 리스트 형태로 보여준다. 하지만 차이점을 위한 예시로 1000개의 데이터 목록을 보여주..
[Android] 웹뷰 스크롤 하단에 native 버튼 위치시키는 방법 개요 WebView란 애플리케이션에서 웹페이지를 보여주고자 할 때 사용한다. 주로 사용자 가이드, 서비스 이용약관, 이벤트 페이지 같은 업데이트해야 할 정보가 있는 경우이다. 특히 스크롤 형태의 웹페이지를 애플리케이션에서 WebView 전체 화면으로 사용한다면 문제가 없지만, 스크롤이 끝난 웹페이지 하단에서 버튼을 사용하고 싶다면 어떻게 처리하는지 다루고자 한다. 방법 NestedScrollView를 사용하는 것이다! 최상위 레이아웃을 NestedScrollView로 감싸고 fillViewport 옵션 활성화 (웹페이지 높이(스크롤 여부)와 상관없이 항상 버튼 하단에 위치시키기 위함) 그다음 WebView의 height는 wrap_content Button의 위치는 상단 제약으로 WebView 아래 / ..
[Android] Realm 데이터베이스 사용하기 Realm? Realm이란 모바일 데이터베이스로 SQLite를 대체할 수 있다. SQLite와 달리 데이터를 객체 형태로 구성하기에 데이터 쿼리 시 SQL문법을 몰라도 사용할 수 있다. 다른 모바일 데이터베이스보다 성능이 좋고, 커뮤니티가 활발하다. 사용하기 1. 프로젝트의 build.gradle 파일에 realm 종속성을 추가한다. buildscript { repositories { google() mavenCentral() } dependencies { classpath "com.android.tools.build:gradle:7.0.2" classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:1.5.30" classpath "io.realm:realm-grad..