HOME > android > basic

AndroidX - MultiDex 적용하는 방법

AndroidX를 사용할 때 앱을 MultiDex로 설정하는 방법을 소개합니다. 안드로이드 코드는 dex라는 파일로 컴파일이 됩니다. dex는 65,535개의 메소드만 컴파일이 됩니다. 이를 초과하는 앱을 생성하면 MultiDex로 설정하여 Apk파일에 dex가 두개 이상으로 컴파일되도록 해야 합니다.

10 Nov 2019

안드로이드 - SAF(Storage Access Framework)로 파일 읽고 쓰는 방법

SAF(Storage Access Framework)는 문서 및 이미지 등 각종 파일을 탐색하고 저장하는 작업을 간편하게 하려고 도입하였습니다. 앱은 ACTION_OPEN_DOCUMENT, ACTION_CREATE_DOCUMENT 등의 인텐트로 파일을 읽고 쓸 수 있습니다. Document Provider, Client app, Selector 등으로 구성되어있습니다.

24 Oct 2019

안드로이드 - MediaStore(Media Provider)에 파일 저장하는 방법

Media provider는 단말에 저장된 이미지, 동영상, 오디오 파일의 정보를 제공하는 프로바이더입니다. Scoped Storage가 적용되면서 미디어 데이터를 저장할 때는 MediaStore를 이용하기를 권장하고 있습니다. P와 Q에서 MediaStore에 데이터를 저장하는 방법을 알아보고, 차이점을 알아보겠습니다.

19 Oct 2019

안드로이드 - MediaStore(Media Provider)에서 미디어 파일 정보 읽기

Media provider는 단말에 저장된 이미지, 동영상, 오디오 파일의 정보를 제공하는 프로바이더입니다. MediaStore는 앱이 Media provider가 제공하는 파일들을 접근할 수 있도록 도와주는 API들의 묶음입니다. MediaStore의 API들이 어떤 의미인지 이해하고, 그 API를 통해 Media provider에 쿼리를 하여 데이터를 얻으면 됩니다.

19 Oct 2019

안드로이드 - CTS(Compatibility Test Suite) 테스트하는 방법

Android CTS는 Compatibility Test Suite의 약자입니다. CTS는 안드로이드의 호환성 테스트로, 제조사에서 안드로이드 단말을 만들면 CTS 테스트를 통과해야 판매를 할 수 있습니다. CTS는 안드로이드의 파편화를 어느정도 막아주며, 테스트 코드에서 요구하는 성능을 충족시키도록 합니다.

16 Oct 2019

안드로이드 - Parcelable을 구현하여 Intent로 데이터를 전달하는 방법

Parcel은 추상화된 객체로 데이터와 객체를 갖고 있는 컨테이너입니다. 프로세스간 데이터를 전달하려면 클래스에 Parcelable을 구현해야 합니다. 안드로이드는 내부적으로 Parcel 객체를 marshall/unmarshall을 수행하여 다른 프로세스에 전달해 줍니다. Parcelable을 구현했다면 인텐트를 통해 다른 프로세스로 전달할 수 있습니다.

09 Oct 2019

안드로이드 UIAutomator로 UI 테스트, 가장 쉽고 빠른 가이드

UIAutomator는 UI를 테스트하는 라이브러리입니다. UIAutomator는 블랙박스 테스팅이며, 두개 이상의 앱을 함께 테스트할 수 있습니다. UiDevice, Until, By, BySelector 클래스를 지원하며 이 클래스들로 테스트 코드를 작성할 수 있습니다.

15 Aug 2019

안드로이드 - UsageStatsManager로 앱 실행 기록 가져오기

UsageStatsManager는 앱 실행 기록을 제공하는 서비스입니다. 앱 기록을 Query할 수 있는 API를 제공하며, DAY, MONTH, YEAR의 시간 단위(Interval)로 구분된 결과를 받을 수 있습니다. 이것은 android.permission.PACKAGE_USAGE_STATS 권한을 요구합니다.

09 Aug 2019

안드로이드 - UID(User Id), GID(Group Id)와 Security

Android는 리눅스의 UID(User Id)와 GID(Group Id)를 사용하여 앱마다 다르게 권한을 설정합니다. 앱이 어떻게 UID와 GID를 할당받는지 알아보고, 권한을 어떻게 확인하는지 알아보겠습니다. 또한 보안 측면에서 어떻게 사용되는지 알아보겠습니다.

07 Aug 2019

안드로이드 - 코드로 앱(apk) 설치, 삭제하는 방법

안드로이드에서 코드로 앱(apk) 설치 및 삭제하는 방법을 설명합니다. 앱은 Google PackageInstaller에게 앱을 삭제하거나 설치하도록 요청할 수 있습니다. 설치 요청하려면 REQUEST_INSTALL_PACKAGES 권한이 있어야 하고, 삭제를 요청하려면 REQUEST_DELETE_PACKAGES 권한이 필요합니다.

02 Aug 2019

안드로이드 - Assets에서 파일을 읽는 방법

Assets은 이미지, String이 아닌 파일 등을 apk에 저장하고 앱에서 읽을 때 사용할 수 있습니다. Assets을 사용하려면 Assets 폴더를 만들고 파일을 저장해야 합니다. 그리고 AssetManager를 통해 파일을 읽어와야 합니다. 이 글에서 Assets 폴더를 만들고 AssetManager로 파일을 읽는 방법에 대해서 알아봅니다.

28 Jul 2019

안드로이드의 다양한 Notification 종류와 구현 방법

Android의 다양한 Notification 종류와 구현 방법에 대해서 정리하였습니다. 먼저 Notification Channel을 등록해야 하고, Notification은 BigText, BigPicture, Inbox, Messaging, Media Style 등으로 구현할 수 있습니다. 또한 Head Up으로 화면에 띄우거나, Reply 버튼을 추가할 수도 있습니다.

27 Jul 2019

안드로이드 - DownloadManager로 파일 다운받는 방법

Android의 DownloadManager는 HTTP 파일을 다운받는데 도와주는 시스템 서비스입니다. 앱은 저장될 위치의 URI와 다운받을 HTTP URI를 DownloadManager에 알려주기만 하면 알아서 받아줍니다. 또한, 내부의 백그라운드 서비스에서 다운을 받기 때문에 앱에서 쓰레드를 생성할 필요는 없습니다.

13 Jan 2019

안드로이드의 명시적, 암시적 인텐트(Explicit, Implicit Intent) (2)

인텐트는 보통 명시적, 암시적 인텐트라고 합니다. 또한 인텐트로 액티비티를 실행할 때 리졸빙 과정을 거칩니다. 인텐트의 속성들을 알아보고 인텐트를 해석할 때 어떤 원리로 동작하는지 상세히 설명하였습니다. 예제 중심으로 이해하기 쉽게 정리하였습니다.

06 Dec 2018

안드로이드의 명시적(Explicit), 암시적(Implicit) 인텐트 완벽히 이해하기!

인텐트는 보통 명시적(Explicit), 암시적(Implicit) 인텐트라고 합니다. 인텐트를 실행하거나 전달할 때, 인텐트를 분석하여 어떤 컴포넌트를 실행할지 찾습니다. 인텐트의 Action, Category, mime type 등 설정하는 값에 따라 어떤 액티비티가 실행되는지 인텐트에 대해서 자세히 분석하였습니다.

05 Dec 2018

안드로이드 - PreferenceFragment 구현 방법

Android PreferenceFragment는 아래와 같은 설정화면을 쉽게 구현해주는 컴포넌트입니다. 매우 적은 코드와 간단한 XML 레이아웃 코드를 추가하여 구현할 수 있습니다. 어떻게 PreferenceFragment를 사용하는지 알아보겠습니다.

03 Dec 2018

안드로이드 - Spinner(스피너) 구현 방법 (AndroidX, Kotlin)

Android Spinner(스피너)는 드롭다운 메뉴입니다. 스피너를 클릭하면 선택가능한 메뉴가 보이고, 이 메뉴 중 하나를 눌렀을 때 출력 값을 다르게 할 수 있습니다. 간단히 XML로 스피너를 생성하는 방법과 리스너를 등록하는 방법을 소개합니다. 또한 어댑터를 생성하여 스피너를 구현하는 방법을 알아보겠습니다.

02 Dec 2018

안드로이드 - RecyclerView 구현 방법 (AndroidX, Kotlin)

Android에서 많은 데이터를 한번에 보여주려고 하면 메모리 등 자원 문제로 버벅이거나 심하면 OOM(Out of Memory)이 발생할 수 있습니다. RecyclerView는 이런 성능문제를 해결하고 데이터를 효율적으로 보여주는 View입니다. 여기서는 코틀린과 AndroidX로 구현하는 방법을 알아보겠습니다.

23 Nov 2018

안드로이드 - NotificationListener를 이용하여 노티 정보 받기

Android의 NotificationListenerService는 Notification에 대한 정보를 받을 수 있는 객체입니다. 안드로이드 SDK는 NotificationManager에 직접 listener를 등록하는 코드는 제공하고 있지 않습니다. 정보를 받고 싶다면 NotificationListenerService를 상속받은 새로운 서비스를 구현하여야 합니다.

10 Nov 2018

Android의 앱 데이터 폴더 경로 및 내부/외부 저장소 설명

Device에 App이 설치되면 App마다 사용할 수 있는 저장공간이 있습니다. 앱은 apk파일, 내부 저장소, 외부 저장소에 파일을 저장할 수 있는 공간이 있습니다. 또한 누구나 사용할 수 있는 공용 공간이 있습니다. 각 폴더의 차이점과 접근할 때 필요한 권한들을 정리하였습니다.

10 Mar 2018

안드로이드 - Activity를 Full screen으로 만들기(Statusbar 숨기기)

앱을 풀스크린으로 실행시키거나, 상태바(Statusbar)가 UX와 어울리지 않을 때 제거하고 싶을 때가 있습니다. Statusbar를 숨기는 방법은 크게 두가지가 있습니다. 첫번째는 AndroidManifest.xml에 Activity의 theme를 설정하거나, 두번째는 Java에서 Code로 설정하는 방법입니다.

05 Mar 2018

안드로이드 - Messenger를 이용하여 Remote Service 구현하기

Android의 Remote Service는 App의 Main process와 다른 Process에서 실행되는 Service를 말합니다. 안드로이드에서는 RPC(Remote Procedure Call)를 Binder를 통해서 지원을 하는데, AIDL과 Messenger로 구현할 수 있습니다. 이 두가지 방법에 대해서 알아보겠습니다.

05 Mar 2018

안드로이드 - Button, TextView를 구현하는 방법

Button은 버튼 입력을 받고, TextView는 Text를 표현할 때 사용하는 View입니다. 물론, 이들은 ViewGroup이 아니기 때문에 다른 View들의 위치를 정하는 일은 할 수 없습니다. 보통 UI는 모두 xml파일에 정의하고, 이벤트 처리는 Java에서 합니다.

06 Jan 2018

안드로이드 - ConstraintLayout 구현 방법

Android의 ConstraintLayout는 유연하게 다른 View들을 배치할 수 있는 ViewGroup입니다. 이 Layout은 Android SDK에 포함되어있지 않기 때문에 Android Support Library로 API Level 9부터 지원을 하고 있습니다. 사용하려면 Android Support Library를 gradle에서 load를 해야 합니다.

16 Sep 2017

안드로이드 - LinearLayout 구현 방법

Android의 LinearLayout은 세로 또는 가로의 단일 방향으로 모든 하위 View 객체를 정렬하는 ViewGroup입니다. Orientation 속성은 LinearLayout의 하위 View들을 정렬하는 방향을 정합니다. layout_weight는 내부 객체들의 크기를 비율로 정해주는 방식입니다.

03 Sep 2017

안드로이드 - RelativeLayout을 사용하는 방법

RelativeLayout은 부모(Parent) View 또는 자식(Child) View의 상대적 위치 관계를 정의하여 UI를 배치하는 Layout입니다. LinearLayout은 가로 또는 세로 방향으로 View가 순서대로 배치되었지만 RelativeLayout은 객체간의 상대적인 위치 관계를 정의하지 않으면 배치가 되지 않습니다.

03 Sep 2017

안드로이드 - Layout의 기본적인 속성들에 대해서 알아보기

ViewGroup 객체는 View 객체를 상속하고 있습니다. 이런 관계처럼 이 둘은 공통적으로 갖고 있는 속성들이 많습니다. 이번 튜토리얼에서는 기본적으로 알야야 하는 속성에 대해서 알아보겠습니다.

02 Sep 2017

안드로이드 - View와 ViewGroup에 대해서 알아보기

안드로이드에서 UI 요소들은 크게 View와 View Group 객체로 이루어져 있습니다. Java에서도 UI Layout을 정의할 수 있지만 가장 간단한 방법은 layout에 xml파일로 정의를 하는 것 입니다. 이번 튜토리얼에서는 안드로이드 프로젝트에서 UI Layout을 어떻게 정의하는지 알아보겠습니다.

01 Sep 2017

안드로이드 - Activity Back Stack에 대해서 알아보기

Android의 Activity Back Stack은 Activity의 작업을 관리하는 자료구조로 마치 Stack(후입선출)처럼 동작합니다. 동일한 Activity가 여러번 실행되었을 때 Activity의 Stack을 어떻게 할지 등 다양한 변수가 발생하는데, Android는 개발자가 의도한 UX에 맞게 Activity가 동작하도록 여러 속성을 지원합니다.

21 Aug 2017

안드로이드 - Activity Lifecycle(생애주기) 알아보기

Android의 Activity Lifecycle이란 Activity가 생성되고 종료되기 까지의 상태(State)를 말합니다. Activity는 6개의 주요 Callback method를 제공해주는데 Activity의 상태가 변경될 때마다 각각의 Callback method를 호출해줍니다.

20 Aug 2017

안드로이드 - Toast & Log를 출력하는 방법

Android의 Toast와 Log 출력 방법에 대해서 알아봅니다. Toast는 사용자에게 알림 등의 메시지를 주는 용도로 사용합니다. Log는 개발을 하면서 이 코드가 정상적으로 작동하는지 확인하는 디버깅 용도로 사용합니다. Toast는 화면 아래쪽에 뜨는 메시지입니다.

19 Aug 2017

안드로이드 - 다른 Activity 실행하는 방법

매우 기본적인 튜토리얼입니다. 안드로이드 프로젝트를 생성하고 Activity를 생성하고 실행해보겠습니다.

18 Aug 2017

안드로이드 - Project 구조 알아보기

안드로이드 스튜디오로 프로젝트를 만들 때 왼편에 디렉토리 구조를 볼 수 있습니다. 각각의 폴더가 무슨 의미인지, 파일은 어떤 용도로 사용되는지 자세히 알아보겠습니다.

17 Aug 2017

안드로이드 - 첫번째 App 만들기

Android Studio 설치 및 SDK를 모두 설치하였다면 Android 개발환경을 모두 갖춘 것입니다. 다른 것을 학습하기 전에, 먼저 Android Studio에서 Project를 생성하고 빌드하여 내 디바이스에 앱을 설치해보겠습니다.

15 Aug 2017