본문 바로가기
프로그래밍/Android

안드로이드 컴포넌트

by Daniel.kwak 2018. 12. 6.

안드로이드 어플리케이션은 어떤 구조를 가지고 있는지 살펴보자.


안드로이드 구조는 사용자가 눈으로 보면서 상호작용을 하는 컴포넌트 - Activity , Notification이 있고, 

눈에 보이지 않거나 백그라운드에서 실행되는 컴포넌트 - Broadcast Receiver, Content Provider, Service가 있다.

intent와 notification은 안드로이드의 컴포넌트라고는 할 수 없지만 매우 밀접한 연관이 있으므로 같이 다룬다.


애플리케이션은 이들 컴포넌트의 여러 구성요소로 이루어져 있고 이들을 서로 호출하기 위해서는 intent를 사용한다. 


Activity

액티비티는 애플리케이션의 한 화면을 뜻한다. 또한 실제 사용자와 소통하여 상호작용하는 컴포넌트이다. 

안드로이드는 메모리 관리를 위해 액티비티 생명주기에 따라 사용하지 않는 액티비티는 비활성시키거나 종료시킬 수 있다. 이러한 특성으로 인해 액티비티 생명주기를 정확하게 이해하고 있어야 하며, 적절한 처리를 해주는게 중요하다. 


Service

화면에 표시되어 사용자와 상호작용하는 Activity와는 달리, 백그라운드에서 실행되는 컴포넌트이다. 

예를 들어 음악을 재생하는 어플리케이션은 화면에서 관련 UI를 띄우지 않은 상태일 때 사용자와 상호작용을 하지 않더라도 음악을 계속 재생할 수 있어야 한다. 따라서 일반적으로 음악을 재생하는 어플리케이션은 음악을 재생하는 부분은 service에 구현하며 사용자와 상호작용이 중단되더라도 지속적으로 음악을 재생할 수 있어야 한다. 


Content Provider

어플리케이션 내의 데이터(전화번호부, 메모..등)를 다른 애플리케이션과 공유할 수 있도록 해준다. 어플 내의 데이터는 기본적으로는 해당 어플리케이션만 접근할 수 있고 다른 어플리케이션은 접근할 수 없다. 그래서 특정 어플리케이션에서 전화번호부 같은 데이터를 얻어오기 위해서는 Content Provider를 정의하여 다른 어플리케이션에서 전화번호부에 접근할 수 있는 범위나 방식을 정의해줘야 한다. 즉, Content Provider가 어플리케이션끼리 접근하는 통로가 되는 셈이다. 


일반적으로 Content Provider를 이용하여 전화번호부 같은 어플리케이션에서 공유할 데이터만을 선택하여 공유할 수 있도록 한다. 이 과정에서 해당 Content Provider로 접근할 수 있는 고유의 주소를 정의하게 되며, Content Resolver에 이 주소를 넘겨서 공유된 데이터에 접근할 수 있다. 



Broadcast Reciever 

주로 시스템 상태에 관련된 메세지(배터리 부족, 언어 변경 등)나 어플리케이션의 메세지 (파일 다운로드 완료와 같은)에 응답하는 역할을 한다. Broadcast Reciever는 이러한 메세지가 발생하면 캐치만 할 수 있고 이를 사용자에게 알릴 수는 없다. 이를 알리기 위해 Notification이나 Toast를 사용한다. 



Notification

NotificationManager를 통해 상태표시줄에 표시하거나 Notification Panel을 통해 알림 메세지를 띄워주거나 , LED를 점멸시키거나, 진동 발생 혹은 벨소리를 울리게 하여 사용자에게 해당 이벤트를 알린다. 이러한 Notiication은 파일 다운로드 완료나, 문자 메세지 도착 등을 사용자에게 알린다.



Inent 

지금까지 알아본 컴포넌트들을 호출하거나 호출하면서 데이터를 전달하는 역할을 한다. 일종의 전달 매체이다. 인텐트 내부에는 대상 컴포넌트의 정보가 담겨있고, 담고있는 정보의 유형에 따라 Explicit Intent(명시적 인텐트) , Implicit Intent(암시적 인텐트)로 나뉜다.

명시적 인텐트는 호출하거나 데이터를 전달한 컴포넌트가 명확하게 명시된 경우이다. 대상 컴포넌트가 명확하면 인텐트가 해당하는 컴포넌트를 호출하거나 데이터를 전달할 수 있다.

암시적 인텐트는 호출하거나 전달할 데이터가 명시적으로 적지 않고 대상 컴포넌트의 특징들만 나열한 인텐트이다.  암시적 인텐트가 동작되기 위해서는 각 컴포넌트에게 해당 컴포넌트가 처리할 수 있는 작업을 정확하게 명시해야 한다. 그래야 호출되는 컴포넌트가 인텐트를 받아서 작업을 처리할 수 있다. 이렇게 적절한 인텐트의 컴포넌트를 찾는 과정을 인텐트 해석(intent resolve)라고 한다. 

인텐트 해석에 필요한 정보는 안드로이드의 매니페스트 파일의 각 컴포넌트 태그 안에 있는 Intent filter에 명시되어 있으며 이곳에는 각 컴포넌트가 처리할 수 있는 작업의 유형 및 필요한 데이터까지 명시할 수 있다.