본문 바로가기

전체 글134

17-1 저장소에 데이터 보관하기 여섯째 마당: 앱에 다양한 기능 추가하기(17~19장) 안드로이드 앱은 대부분 서버와 데이터를 주고받거나 데이터를 데이터베이스에 저장해서 계속 이용할 수 있게 한다. 이런 기능을 앱에 추가하는 방법을 살펴보자. 17장에서는 앱의 데이터를 저장하고 이용하는 방법을 다룬다. 앱은 데이터를 저장하고 가공하여 서비스 할 수 있다. 이때 앱의 데이터는 대부분 외부 서버에 저장해놓고 통신으로 주고받지만 네트워크가 불안정한 상황도 있을 수 있으므로 안정된 서비스 제공을 목적으로 기기에 저장하는 방법도 알아야 한다. 안드로이드 기기에 데이터를 저장하는 방법은 크게 세가지로 나뉜다. 1️⃣데이터베이스, 2️⃣파일, 3️⃣프리퍼런스를 이용한다. 모두 자주 사용하므로 잘 알아두자. 데이터베이스 프로그래밍은 데이터 베이스에 .. 2023. 7. 9.
16-2 안드로이드 기본 앱과 연동하기 이번에는 안드로이드의 기본 앱을 연동하는 방법을 알아보자. 안드로이드 기본 앱 가운데 주소록 갤러리, 카메라, 지도, 전화 앱을 내가 만든 앱과 어떻게 연동하는지 살펴보자. 주소록 앱 연동하기 주소록은 가장 많이 이용하는 안드로이드의 기본 앱이다. 핸드폰의 주소록 앱을 연동하여 주소록 목록을 띄우고 사용자가 선택한 사람의 전화번호나 이메일 정보를 가져와 내가 만든 앱에서 이용할 수 있다. 우선 주소록 앱에서 데이터를 가져오려면 다음과 같은 퍼미션을 설정해야 한다. // 주소록 앱 사용 퍼미션 설정 그리고 주소록의 목록 화면을 띄우는 코드를 작성한다. // 주소록 목록 출력 val intent = intent(Intent.ACITON_PICK, ContactsContract.CommonDataKinds.P.. 2023. 7. 9.
16-1 콘텐츠 프로바이더 이해하기 액티비티, 브로드캐스트 리시버, 서비스에 이어 마지막 컴포넌트인 콘텐츠 프로바이더 컴포넌트를 살펴보자. 콘텐츠 프로바이더는 앱의 데이터를 다른 앱과 공유할 때 사용한다. 안드로이드 앱은 구글이 제공하는 기본 앱과 연동하는 일이 많으므로 콘텐츠 프로바이더를 잘 다룰 수 있어야 한다. 콘텐츠 프로바이더는 앱끼리 데이터를 연동하는 컴포넌트이다. 예를 들어 앱을 개발하면서 다른 앱의 데이터를 사용할 때 콘텐츠 프로바이더를 이용한다. 이때 데이터는 대상 앱의 데이터베이스나 파일 또는 앱에 할당된 메모리에 있다. 콘텐츠 프로바이더를 이용하면 이런 저장소에 있는 데이터를 가져오거나 수정할 수 있다. 앱의 데이터는 그 앱의 구성 요소에서 이용할 때는 문제가 없지만 외부 앱에서는 기본적으로 접근하지 못한다. 외부 앱에서.. 2023. 7. 8.
15-4 잡 스케줄러 앞에서 설명한 대로 앱이 백그라운드 상황일 때 작업 처리에 영향을 받지만 잡 스케줄러를 이용하면 이를 보완할 수 있다. 잡 스케줄러는 안드로이드 5 버전(API 레벨 21)부터 제공했지만 안드로이드 8 버전부터 백그라운드 제약이 생기면서 더 중요해졌다. 잡 스케줄러를 이용한다고 해서 모든 상황의 백그라운드 처리를 할 수 있는 것은 아니다. 잡 스케줄러도 개발자가 만드는 서비스이므로 이 서비스를 어떤 상황에서 실행해야 하는지 조건을 명시해 줘야 한다. 이렇게 조건을 명시할 수 있는 상황에서만 백그라운드에서 처리할 수 있다. 잡 스케줄러의 실행 조건 잡 스케줄러에 조건으로 명시할 수 있는 상황은 다음과 같다. 네트워크 타입 배터리 충전 상태 특정 앱의 콘텐츠 프로바이더 갱신(대표적으로 갤러리 앱) 네트워크 .. 2023. 7. 8.
15-3 백그라운드 제약 안드로이드 앱은 액티비티, 서비스, 브로드캐스트 리시버, 콘텐츠 프로바이더 등 4개의 컴포넌트로 구성되는데, 액티비티를 제외하고는 모두 화면 구현이 아닌 백그라운드에서의 작업 처리가 목적인 컴포넌트들이다. 예전에는 화면이 출력된 적이 없는 상황에서도 서비스나 브로드캐스트 리시버로 백그라운드에서 작업을 처리할 수 있었지만, 안드로이드 8버전(API 레벨 26)부터는 제약을받는다. 따라서 브로드캐스트 리시버나 서비스를 이용할 때는 백그라운드 제약에 관해 잘 정리해둬야 한다. 브로드캐스트 리시버의 백그라운드 제약부터 알아보자 리시버의 백그라운드 제약 브로드캐스트 리시버를 실행하려면 sendBroadcast() 함수로 인텐트를 시스템에 전달해야 한다. 그런데 브로드캐스트 리시버는 암시적 인텐트로 실행할 수 없다.. 2023. 7. 7.
15-2 바인딩 서비스 IBinder 객체 바인딩 앞 절에서 살펴본 것처럼 서비스를 실행하는 함수를 2개 제공하는 이유는 서비스를 이용하는 상황을 2가지로 구분하기 위해서이다. 예를 들어 액티비티*에서 startService() 함수로 서비스를 실행했다고 가정해 보자. *서비스를 실행한 곳은 액티비티가 아닌 '다른' 컴포넌트일 수도 있다. 그러면 백그라운드 작업은 필요하지만 액티비티와 데이터를 주고받을 일이 없는 등 서로 관련이 없다면 startService() 함수로 서비스를 실행하면 된다. 그런데 어떤 경우에는 서비스와 액티비티가 상호작용 해야 할 때가 있다. bindService()는 이러한 목적으로 호출하는 함수이다. bindService() 함수 이름에서 'bind'는 서비스가 실행되면서 자신을 실행한 곳에 객체를 바.. 2023. 7. 7.