본문 바로가기

깡샘 코틀린69

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.
15-1 서비스 컴포넌트 액티비티 컴포넌트, 브로드캐스트 리시버 컴포넌트에 이어 세번째 컴포넌트를 알아보자. 서비스는 오래 걸리는 작업을 백그라운드에서 처리할 수 있게 해 주는 컴포넌트이다. 따라서 서비스에 화면을 구현하지는 않는다. 그리고 서비스 역시 안드로이드의 컴포넌트이므로 생명주기를 시스템에서 관리한다. 서비스 생성과 실행 서비스 컴포넌트는 Service 클래스를 상속받아서 작성한다. 서비스에는 다양한 생명주기 함수를 재정의할 수 있지만 onBind()는 필수이다. // 서비스 컴포넌트 생성 class MyService : Service() { // 서비스 컴포넌트 위해 서비스 클래스 상속받고 override fun onBind(intent: Intent): IBinder? { // 필수인 onBind() 생명주기 함수 .. 2023. 7. 6.
14-2 시스템 상태 파악하기 시스템에서 발생하는 인텐트는 여러 종류가 있으며 부팅 완료, 화면 켬/끔, 배터리 상태 등이 대표적이다. 이러한 상황에서 앱의 리시버를 어떻게 실행하는지 알아보자. 부팅 완료 만약 전원을 누르고 앱에서 부팅이 완료될 때 특정한 작업을 수행(목적)하고 싶다면 1️⃣브로드캐스트 리시버를 만들고 2️⃣매니페스트 파일에 인텐트 필터를 구성해서 등록한다. 부팅이 완료되면 시스템에서는 android.intent.action.BOOT_COMPLETED라는 액션 문자열을 포함하는 인텐트가 발생한다. 이때 실행하고 싶은 리시버에는 의 name 속성에 똑같은 액션 문자열을 똑같이 등록하면 된다. // 브로드캐스트 리시버와 인텐트 필터 등록 // 인텐트 필터 등록 // 부팅 완료될 때 발생하는 인텐트의 액션문자열을 브로드캐.. 2023. 7. 3.
14-1 브로드캐스트 리시버 이해하기 브로드캐스트 리시버는 흔히 이벤트 모델로 실행되는 컴포넌트라고 정의한다. 여기서 이벤트란 액티비티를 다룰 때 살펴본 사용자 이벤트가 아니라 부팅이 완료되는 것과 같은 시스템의 특정한 상황을 말한다. 시스템의 어떤 이벤트가 발생하면 브로드캐스트 리시버를 실행해 앱이 해당 상황에 맞게 동작하도록 할 수 있다. 브로드캐스트 리시버(broadcast receiver)는 줄여서 리시버라고도 하며 직역하면 '방송 수신기'이다. 즉, 시스템에서 특정한 상황을 알리는 방송을 할 때 이를 받아서 처리하는 수신기를 앱에 장착하는 것이다. 이 수신기도 액티비티처럼 안드로이드의 컴포넌트이므로 인텐트를 시스템에 전달함으로써 실행한다. 브로드캐스트 리시버 만들기 브로드캐스트 리시버를 만들려면 BroadcastReceiver를 상.. 2023. 7. 3.
섹션 0. 들어가기에 앞서 import하는 법 예를 들어 intent 쓰면 빨간 줄 뜸 거기서 option+enter(맥 버전) 누르면 임포트 됨 레이아웃 글씨 색 설정 res-layout-activity_main.xml 에서 글자크기와 글자색 설정할 수 있음 android:textColor=""까지만 치면 밑에 black/white 선택 뜰수도 있는데 안뜨면 아래와 같이 설정할 수 있음 android:textSize="58dp" android:textColor="color/black" android:textColor="#000000" // 글자색 검은색 android:textColor="#ffffff" // 글자색 흰색 못외우겠으면 구글에 검정색/흰색 hex를 검색하면 색깔코드 찾을 수 있음 또는 res-values-colors.. 2023. 7. 2.
13-5 액티비티 ANR 문제와 코루틴 ANR 문제란? 액티비티 컴포넌트에서 마지막으로 다룰 주제는 ANR이다. ANR(activiy not response)은 액티비티가 응답하지 않는 오류 상황을 의미한다. 액티비티를 작성할 때 ANR을 고려하지 않으면 앱이 수시로 종료될 수 있다. 시스템에서 액티비티를 실행하는 수행 흐름을 메인 스레드 또는 화면을 출력하는 수행 흐름이라는 의미에서 UI 스레드라고 한다. 메인 스레드가 오래 걸리는 작업을 실행한다고 그 자체로 오류가 생기는 건 아니지만, 사용자가 액티비티 화면을 터치하는 등 이벤트가 발생하면 오류가 생길 수 있으므로 액티비티를 작성할 때 항상 ANR 오류를 고려해야 한다. 액티비티에서 시간이 오래 걸리는 대표적인 작업은 서버와 통신하는 네트워크이다. 정상적인 상황에서는 서버와 연결하여 데이.. 2023. 7. 1.
13-4 태스크 관리 태스크(task) 관리란 액티비티를 어떻게 생성하고 관리하는지를 제어하는 일을 의미한다. 시스템에는 액티비티의 태스크를 유지하는 기본 규칙이 있으며 일반적으로는 이 기본 규칙을 그대로 이용하지만 특정한 상황에서 개발자가 액티비티의 태스크를 관리해야 한다면 설정을 추가할 수도 있다. 시스템에서 태스크 관리 액티비티 태스크란? 앱이 실행될 때 시스템에서 액티비티의 각종 정보를 저장하는 공간 A 앱이 A_OneActivitiy, A_TwoActivity 두 액티비티로 구성되어있다고 가정하자. 사용자가 앱을 실행해 A_OneActivity 화면이 나오고 다시 A_OneActivity에서 인텐트로 A_TwoActivity를 실행했다고 생각해보자. 그러면 액티비티 객체가 2개가 생성되고 시스템은 이 액티비티가 실행.. 2023. 7. 1.