안드로이드 앱 아키텍처의 가장 큰 특징은 컴포넌트 기반이라는 것입니다. 그렇다면 컴포넌트는 무엇이고 어떤 역할을 수행하는지 알아보겠습니다.
컴포넌트는 앱의 구성 단위이며, 컴포넌트 여러 개를 조합하여 하나의 앱을 만든다.
안드로이드 앱에서 컴포넌트의 물리적인 모습은 클래스입니다. 하지만 앱에서 만든 모든 클래스가 컴포넌트는 아닙니다. 안드로이드에서 클래스는 컴포넌트와 일반 클래스로 나뉘는데, 일반 클래스의 생명주기는 개발자 코드로 관리하지만 컴포넌트는 생명주기를 안드로이드 시스템이 생성하여 관리하다가 소멸한다는 차이가 있습니다.
컴포넌트는 앱 내에서 독립적인 실행 단위이다.
컴포넌트 클래스는 독립적인 수행 단위로 동작하기 때문에 직접 개발자 코드로 생성해서 실행할 수 있습니다.
예를 들어 A 클래스에서 B 클래스를 실행하려면 흔히 B b = new B(); 같은 구문으로 객체를 생성해서 실행합니다. 하지만 실행하고자하는 B 클래스가 컴포넌트 클래스라면 인텐트(Intent)라는 것을 매개로 하여 결합하지 않은 상태에서 독리벅으로 실행하는 구조입니다.
main 함수 같은 애플리케이션의 진입 지점이 따로 없다
앱은 수행 시점이 다양합니다. 컴포넌트 클래스들은 모두 프로세스가 구동되었을 때 최초로 실행되는 수행 시점이 될 수 있습니다.
예를 들어 사용자가 SMS를 실행한 적이 없다고 가정할 때, 어느 순간 스마트폰에 SMS가 전달된다면 사용자가 앱을 실행하지 않아도 SMS 수신 기능을 하는 컴포넌트부터 실행되어 프로세스가 구동될 수 있습니다.
애플리케이션 라이브러리 개념이 있다.
안드로이드가 컴포넌트 기반이기 때문에 개발자 코드의 결합이 발생하지 않으므로 외부 앱의 컴포넌트도 실행할 수 있습니다. 개발자가 만들지 않았는데 그 앱의 기능처럼 느껴진다면, 그것은 라이브러리입니다.
안드로이드 컴포넌트의 종류
- 액티비티 : UI를 구성하기 위한 컴포넌트
- 서비스 : UI 없이 백그라운드에서 장시간 수행되는 컴포넌트
- 콘텐츠 프로바이더 : 애플리케이션 간 데이터를 공유하기 위한 컴포넌트
- 브로드캐스트 리시버 : 이벤트 모델로 수행되는 컴포넌트
액티비티는 사용자 화면을 제공하는 컴포넌트이고 가장 많이 작성하는 컴포넌트입니다.
서비스는 화면과 전혀 상관없이 사용자 눈에는 보이지 않지만, 백그라운드에서 장시간 무언가를 수행할 수 있는 컴포넌트 입니다. 서비스는 메인 스레드에서 동작한다는 점이 중요합니다.
콘텐츠 프로바이더는 앱 간의 데이터 공유 목적으로 사용하는 컴포넌트입니다. 안드로이드 스마트폰에는 여러 앱이 있고, 그 앱들 간의 데이터를 공유하기 위한 목적입니다. 예를 들어 개발자가 만든 앱에서 다른 앱의 데이터가 필요하다면 다른 앱의 데이터를 얻어야하는데 이 때 필요한 컴포넌트가 콘텐츠 프로바이더입니다.
브로드캐스트 리시버는 안드로이드 개발 시 자주 이용합니다. 시스템에서 배터리가 부족하거나 시스템 부팅이 완료되는 등의 이벤트가 발생했을 때, 이 이벤트를 받기 위해 작성하는 컴포넌트 정도로 이해하면 될 것 같습니다.
참조 — 깡샘의 안드로이드 프로그래밍