관리 메뉴

드럼치는 프로그래머

[안드로이드] 안드로이드 어플리케이션의 구성요소 본문

★─Programing/☆─Android

[안드로이드] 안드로이드 어플리케이션의 구성요소

드럼치는한동이 2009. 11. 2. 16:53
안드로이드 어플리케이션을 만들기 전에 안드로이드 어플리케이션은 과연 어떤 구조를 가지고 있을까? 에 대해서 알아보도록 하겠습니다. 

안드로이드 어플리케이션이 어떤 구조를 가지고 있는지 알고 있어야만 앞으로 진행할 강좌도 무리없이 소화할 수 있고, 무엇보다도 처음부터 "개념"을 잡고 가는 것과 저처럼 이것저것 막 파보다가(..) 깨지기도 해보고, 하나하나씩 잡다하게 주워들은 것들을 합쳐서 알아가는 것은 지식의 완성도(?) 뿐만 아니라 이해하는 속도에 있어서도 매우 많은 차이를 보이기에 좀 지루한 감이 있더라도 잘 읽고 이해하도록 해 주세요.


 

가능하다면 그냥 외우세요! 정말 중요한겁니다!!


안드로이드 어플리케이션의 구성 요소는 다음과 같이 크게 사용자와 직접 상호작용을 하거나 사용자가 직접 눈으로 볼 수 있는 컴포넌트와 그렇지 않은 컴포넌트들로 나눌 수 있습니다.




하나의 어플리케이션을 구성하는 컴포넌트는 액티비티, Notification, 컨텐트 프로바이더(Content Provider), 서비스(Service), Broadcast Receiver가 있으며, 이들 컴포넌트들을 호출하기 위한 수단으로 인텐트(Intent)가 존재합니다.

인텐트도 어플리케이션 내에 포함되는것이 아니냐? 할 수도 있지만, 엄연히 따지면 "인텐트" 자체는 어플리케이션 컴포넌트들과 관련만 있을 뿐 어플리케이션 네에 종속한다고 보기는 어렵습니다. 반면에, 인텐트 필터(Intent-Filter)는 어플리케이션 내에 존재한다고 볼 수 있죠. 인텐트와 인텐트 필터에 대한 자세한 설명은 추후에 다룰 예정이지, 여기에서는 인텐트가 무엇을 하는 것인지에 대한 개념까지만 잡도록 하겠습니다.


일단, 인텐트에 대한 것은 조금 후에 보도록 하고, 액티비티부터 설명을 시작해 보도록 하죠.


액티비티(Activity)
는 어플리케이션의 "한 화면"을 뜻합니다, 전화번호부 어플리케이션을 예로 들자면 전화번호부를 조회하는 화면, 전화번호를 새로 추가하는 화면, 입력된 데이터를 수정하는 화면 등등... 이 하나의 액티비티가 될 수 있겠죠?


        전화번호부 조회 화면               전화부 편집 화면                   전화부 선택 화면

액티비티는 어플리케이션 컴포넌트 중 가장 중요한 역할, 사용자의 입력을 받고 사용자에게 그 결과를 보여주는 등 실질적으로 상호작용을 합니다. 따라서, 어플리케이션 개발에서 가장 신경써야 할 부분이기도 합니다.

기본적으로 안드로이드가 휴대용 기기에서 돌아가는 OS다보니, PC와 비교해 메모리가 부족할 수 밖에 없습니다. 그러다보니, 메모리가 부족해지면 우선순위가 낮은 데이터는 메모리에서 지워야  다른 작업을 할 수 있습니다.

액티비티 또한 메모리가 부족해질 경우를 대비하여 액티비티 생애 주기(LifeCycle)에 따라 현재 사용자와 상호작용을 하지 않는 액티비티를 종료시킬 수 있습니다. 이러한 특성 때문에 각 액티비티의 상태별로 적절한 처리를 해주는 것이 중요합니다. 액티비티의 생애 주기에 대한 설명은 추후에 다룰 예정이니 일단은 이 정도만 알면 기본적인 개념을 이해하는데는 충분할 것입니다. 

 
서비스(Service)는 사용자와 직접 상호작용을 하는 액티비티와는 달리 사용자와의 상호작용 없이 백그라운드에서 실행되는 컴포넌트입니다.

앞서 언급했듯이, 액티비티는 액티비티 생애 주기에 의해 사용자와 상호작용을 하지 않는 액티비티는 소멸될 수 있습니다. 따라서, 음악을 재생하는 어플리케이션에서 음악 재생을 담당하는 부분이 액티비티에 있다면 액티비티가 화면에서 없어짐과 동시에 음악 재생이 중지되겠죠? (나중에 자세히 다루겠지만, 일반적으로 액티비티가 화면에서 보이지 않게 되면 onStop()메소드가 호출되면서 액티비티의 상태는 [정지] 상태가 됩니다.)



음악을 재생하는 어플리케이션은 해당 어플리케이션이 사용자와 상호작용을 하지 않고 있더라도 계속 음악을 재생할 수 있어야 합니다. 따라서, 음악 재생 어플리케이션에서 음악을 재생하는 부분은 서비스 부분에 구현하여 사용자와 상호작용이 중단되더라도 지속적으로 음악을 재생할 수 있게 해줍니다.


컨텐트 프로바이더(Content Provider)는 어플리케이션 내의 데이터 (전화번호부, 메모 등..)를 다른 어플리케이션과 공유할 수 있도록 해줍니다.

어플리케이션 내의 데이터들은 기본적으로 해당 어플리케이션만 접근할 수 있고, 다른 어플리케이션은 접근할 수 없습니다. 그래서 특정 어플리케이션 내의 데이터 (예: 전화번호부 데이터)를 다른 어플리케이션에서도 접근할 수 있게 하려면 알맞는 컨텐트 프로바이더를 만들어야 합니다.

컨텐트 프로바이더는 데이터를 공유할 어플리케이션에서 공유를 할 데이터만을 선택하여 공유를 할 수 있도록 지정할 수 있으며, 이렇게 컨텐트 프로바이더를 통해 공유된 데이터는 컨텐트 리졸버(Content Resolver)를 통해 다른 어플리케이션에서 접근할 수 있습니다.



컨텐트 프로바이더는 마치 싸이월드 미니홈피와 비슷하다고 할 수 있습니다. 자신의 개인적인 사진을 다른 사진은 볼 방법이 없지만, 미니홈피에 적절한 수위(?) 혹은 검열(??)을 거쳐 사진을 올린다면 다른 사람도 자신의 개인적인 사진을 일부나마 볼 수 있는 것처럼, 컨텐트 프로바이더도 내가 가진 데이터를 공개함과 동시에 그 데이터의 공개 범위를 어느 정도 제한하는 역할도 동시에 수행한다고 보시면 됩니다.

 
브로드캐스트 리시버(Broadcast Receiver)는 주로 시스템의 상태에 관련된 메시지 (배터리 부족, 언어 변경됨 등..) 혹은 어플리케이션의 메시지 (파일 다운로드 완료 등..)에 응답하는 역할을 합니다. 브로드캐스트 리시버는 해당 이벤트가 발생하였을 경우 그를 잡아내는 능력만 있을 뿐, 이를 사용자에게 알릴 방법은 없습니다. 때문에, 사용자에게 해당 이벤트를 알리기 위해 알림(Notification)을 사용합니다.



알림(Notification)은 NotificationManager를 통해 LED를 점멸시키거나, 진동을 발생시키거나, 벨소리를 울리게 하여 사용자에게 해당 이벤트를 알립니다. 그리고, 일반적으로 상태 표시줄에 해당 이벤트에 대한 자세한 정보를 제공하여 사용자가 해당 이벤트를 확인할 수 있도록 합니다.


마지막으로, 인텐트(Intent)에 대해 알아보도록 하죠.


인텐트(Intent)는 어플리케이션의 컴포넌트, 구체적으로 말하자면 액티비티, 서비스, 브로드캐스트 리시버를 호출하거나 해당 컴포넌트에 데이터를 전달해주는 역할을 합니다. 일종의 "전달 매체"라고 하면 적절하겠네요.

인텐트 내부에는 대상 컴포넌트에 대한 정보가 담겨있습니다. 인텐트는 담고 있는 정보의 유형에 따라 명시적 인텐트(Explicit Intent)암시적 인텐트(Implicit Intent)로 나뉩니다.


명시적 인텐트(Explicit Intent)는 호출하거나 데이터를 전달한 컴포넌트가 정확히 명시되어 있는 인텐트입니다. 대상 컴포넌트가 명확할 경우 컴포넌트의 이름을 인텐트에 넣어주면 인텐트에 의해 해당 컴포넌트가 호출되거나 해당 컴포넌트에 데이터가 전달되게 됩니다.

 

정확한 주소가 나와있군요!



암시적 인텐트(Implicit Intent)는 호출하거나 데이터를 전달할 컴포넌트를 정확히 명시하지 않고, 대상 컴포넌트의 속성들만 나열한 인텐트입니다. 예를 들면, 메모를 수정하는 인텐트를 보낸다면, 메모를 수정하는 기능을 가진 컴포넌트를 직접 호출하는 것이 아니라 [메모를 수정할 수 있는 속성을 가진 컴포넌트]를 호출합니다.


 

목적지의 특성이 나열되어있군요


이렇게 암시적 인텐트를 받으려면 각 컴포넌트가 처리할 수 있는 작업을 명시해야 합니다. 그래야 암시적 인텐트를 받아 그 정보를 풀어 해당 조건에 맞는 컴포넌트를 호출할 수 있게 되는 것이죠. 이렇게 인텐트를 해석하여 적절한 컴포넌트를 찾는 과정을 인텐트 해석(Intent resolving)이라 합니다.

인텐트 해석(Intent resolving)에 필요한 정보는 AndroidManifest.xml 의 각 컴포넌트 내의 인텐트 필터 (Intent-filter) 내에 명시됩니다. 이곳에 각 컴포넌트가 처리할 수 잇는 작업의 유형 뿐만 아니라 넘겨받는 데이터의 유형까지 명시해주게 됩니다.


여기까지, 어플리케이션을 이루는 6가지 구성요소에 대해 알아보았습니다.
다음 강좌에서는 실제 개발 환경에서 프로젝트를 생성하는 절차와 프로젝트 생성시 생성되는 파일들에 대해 알아보도록 하겠습니다. ^^


[출처] http://androidhuman.tistory.com/244
Comments