[Android] 안드로이드의 4대 컴포넌트 - 액티비티 (Activity), 서비스 (Service), 브로드캐스트리시버 (BroadcastReceiver), 콘텐트 프로바이더 (Content Provider)




안드로이드에는 4대 컴포넌트라는 것이 존재합니다. 액티비티 (Activity), 서비스 (Service), 브로드캐스트리시버 (BroadcastReceiver), 콘텐트 프로바이더 (Content Provider)를 4대 컴포넌트라고 부르는데요, 안드로이드 앱을 만들 때 앱을 구성하는 요소들이며 핵심이 되는 요소입니다. 해당 컴포넌트에는 몇가지 특징이 있습니다.
  1. Intent를  이용해서 통신을 합니다. 이 때 Intent에 간단한 데이터를 저장해서 넘겨줄 수도 있죠.
  2. 각 컴포넌트는 독립적으로 존재합니다.
  3. 각자 고유의 기능을 수행합니다. 액티비티는 화면을 구성하고, 서비스는 백그라운드에서 실행되어 작업을 하는 등이죠.
그럼 이 컴포넌트들이 무엇이고, 어떤 역할을 하는지 한 번 알아봅시다.


액티비티 (Activity)

안드로이드의 가장 기본적인 컴포넌트입니다. 화면을 띄우는데에 액티비티는 필수입니다. 액티비티가 있기에 비로소 화면이 보여지고 사용자와 상호작용할 수 있게 됩니다. 또한 독자적인 생명주기를 가지고 있어서 상태를 변화하고 저장하며 다른 액티비티 혹은 심지어 앱들과 유연한 전환이 가능해집니다.


1. 안드로이드 앱은 적어도 하나의 액티비티를 가져야 합니다.
위에서 얘기했듯이 안드로이드는 반드시 1개 이상의 액티비티를 가지고 있어야 합니다. 액티비티의 onCreate 함수에서 setContentView를 이용해 레이아웃과 연결을 하고, 이 레이아웃이 화면에 보여지는 UI의 그릇이 되기 때문에 적어도 1개는 있어야하는 것이죠. 액티비티가 없으면 아무것도 없는 화면이 될테니까요.


2. 한 화면에 1개의 액티비티만 보일 수 있습니다.
대신 한 번에 1개의 액티비티만 보여질 수 있습니다. 다른 액티비티로 전환하려면 현재의 액티비티가 onStop을 거쳐 onDestroy까지 가고 비로소 다른 액티비티가 보여지게 됩니다. (onStop이 사용자의 포커스를 잃을 때 호출되는 함수입니다.) 대신 하나의 화면에서 여러 정보를 담고 싶다면 ConstraintLayout 같은 적당한 레이아웃을 사용해서 분할하거나 Fragment로 분할할 수 있습니다. 예전부터 Bottom Navigation Menu를 구현해서 하나의 액티비티에 여러개의 프레그먼트가 들어가서 빠른 화면 전환이 가능할 수 있게 구현을 하는 방식을 많이 사용해왔습니다.



서비스 (Service)

액티비티가 사용자와 직접적으로 상호작용하기 위해 사용되어진 것이라면, 서비스는 사용자에게 보여지지 않고 백그라운드 작업을 처리하기 위해 사용되어 집니다. 요즘 화면에 보이지 않아도 실시간으로 돌아가는 앱들이 많습니다. 유튜브 뮤직, 멜론, 유튜브 등의 뮤직 플레이어 및 미디어 플레이어 및 플랫폼 등이 그런 기능을 가지고 있습니다. 대신 상단의 상태바를 내리면 상태 창(카톡 등의 알림을 받는 창)에 현재 실행 중인 노래가 플레이 되는 것을 볼 수 있습니다. 이것이 바로 서비스, 그 중 포그라운드 서비스 (Foreground Service)를 이용해서 만든 기능입니다. 서비스에는 크게 3가지 종류가 존재하며 아래의 그림과 같은 생명주기를 가지게 됩니다.


1. 포그라운드 서비스 (Foreground Service)
액티비티 등의 화면 상에서 보이는 것이 아닌 알림창을 통해서 사용자와 상호작용을 할 수 있습니다. 위에서 이야기 했듯이 알림창에 앱의 어떤 정보를 간략하게 표시하는 것이죠. 앱을 사용하고 있지 않아도 백그라운드에서 계속 실행이 됩니다.

2. 백그라운드 서비스 (Background Service)
사용자에게 보이지 않는 작업을 수행합니다. 저장소 압축같은 작업을 수행하는데, 중요한 것은 API 26 이상부터는  백그라운드 서비스 사용 제한이 걸리게 됩니다. 그래서 Work Manager나 Alarm Manager로 예약된 작업을 하거나, 아예 해당 작업을 알림창을 띄워서 작업률을 보여주는 형태인 포그라운드 서비스를 이용해 구현하게 되는데, 사실상 Work Manager (또는 Job Scheduler) 등으로 대체되는 편입니다.


3. 바인드 서비스 (Bind Service)
startService가 아닌 bindService를 이용해서 만들게 됩니다. 해당 서비스를 사용하는 액티비티가 죽을 때 연결이 끊기며, 액티비티가 활성화된 상태일 때 마치 액티비티와 서비스가 server-client 와 같은 구조로 작동하게 됩니다. 그래서 앱 안의 기능을 외부에 제공할 때 사용합니다. 

서비스의 생명주기








브로드캐스트 리시버 (Broadcast Receiver)

이름부터 방송이라는 의미를 가지고 있는데, 하나의 앱이 아닌 안드로이드 OS 전반적으로 이벤트를 송수신하기 위한 컴포넌트입니다. 가령 배터리가 부족하다는 상태를 수신하거나, 네트워크가 끊겼다는 정보를 받는 등 시스템 전반적인 정보를 주고 받을 때 사용하는 것입니다. 
안드로이드의 xml에 브로드캐스트 리시버를 선언하거나 직접 코드로 세팅하면 브로드캐스트 리시버를 사용할 수 있습니다. 어떤 UI를 가지고 동작하는 녀석은 아니고, onRecieve 메서드 내에서 안드로이드 상태에 대한 액션을 취할 수 있게 도와주는 것입니다. 



콘텐트 프로바이더 (Content Provider)

다른 앱 간의 데이터 공유와 데이터 관리를 위한 컴포넌트입니다. xml에서 선언하여 사용할 수 있으며 역시 UI를 가지고 동작하는 것이 아니고 데이터베이스와 비슷한 일을 합니다. 데이터베이스와 유사하다는 말처럼 Query문과 CRUD (Create, Read Update, Delete) 명령어가 존재합니다. 또한 SQLite와 같은 데이터베이스처럼 cursor를 사용해서 접근하게 됩니다. 참고로 데이터는 URI를 ContentProvider 인자로 넣어서 전달합니다.





마치며..

4대 컴포넌트에 뭐가 있고 어떤 역할을 하는지 아주 간단하게 알아보았습니다. 사실 구현 방법이나 이를 위해  필요한 지식이 수도 없이 많지만, 하나의 포스트에서 설명하기엔 너무 많을 것 같네요. 기회가 될 때, 또 필요하다면 추가로 포스팅할 예정입니다. 
4대 컴포넌트라는 말처럼 기초적이고 중요한 내용입니다. 잘 정리하면 좋을 것 같습니다.
피드백은 언제나 환영입니다. 부담 없이 댓글로 잘못된 내용을 알려주세요. 읽어주셔서 감사합니다!


댓글