안드로이드(Android) 기본 Component와 Intent안드로이드(Android) 기본 Component와 Intent

Posted at 2013.11.08 00:27 | Posted in == Mobile ==/Android



facebook에 글올리기



안드로이드(Android) 어플리케이션의 주요 구성요소






1. 기본 컴포넌트(Component)


안드로이드 플랫폼은 어플리케이션을 실행시킬 수 있는 네 가지 유형의 Component를 제공한다. 

<액티비티(Activity), 서비스(Service), 브로드캐스트 리시버(Broadcast Receiver), 컨텐트 프로바이더(Content Provider)>


이러한 구성요소들은 안드로이드 어플리케이션 내에서 독자적으로 작업을 실행할 수 있는 진입점으로 이용된다.


하나의 안드로이드 어플리케이션 내에 존재하는 다양한 Component들은 다른 안드로이드 어플리케이션에서도 쉽게 호출되어 원하는 작업을 수행할 수 있다.


-> 어떤 모바일 플랫폼보다 유연하고 재사용성이 높은 어플리케이션을 만들 수 있다.


안드로이드 어플리케이션은 작업을 실행하기 위해 iPhone 어플리케이션 같이 소스코드 상에 main() 메소드를 명시적으로 선언해서 개발할 필요가 없다.


네 가지 Component들 중에 필요한 역할에 따라 적합한 Component들을 구현하기만 하면 적절한 진입점을 찾아 컴포넌트를 실행한다.




(1) 액티비티(Activity) : 안드로이드 어플리케이션이 실행되는 기본적인 단위로서 사용자와 상호작용하는 작업을 수행하는 Component


- 액티비티(Activity)의 특성


사용자와 상호작용할 화면이 무엇인지 정의하고 그 상호작용을 처리할 기능을 구현

-> 따라서 안드로이드 어플리케이션을 개발할 때 각 화면마다 Activity 클래스를 정의하고 구현하는 것이 일반적임.


하나의 안드로이드 어플리케이션은 하나 이상의 Activity들로 구성될 수 있으며 안드로이드 어플리케이션이 실행될 때 처음으로 시작될 Main Activity를 정의 가능

-> Main Activity는 해당 안드로이드 어플리케이션이 실행되는 진입점이 될 수 있음.


- 액티비티(Activity)의 구현 방법


Activity는 일반적으로 Activity 클래스를 확장하여 구현 가능


Activity 클래스 안에 Activity 라이프사이클에 따른 다양한 메소드를 구현하여 사용자와의 다양한 상호작용 작업 처리 가능


다른 Component에서 Activity를 시작하려면 startActivity() 또는 startActivityForResult() 메소드를 호출


startActivity()와 startActivityForResult() 메소드는 Intent 객체를 매개변수로 받음


* Intent 객체 : 안드로이드 플랫폼에게 특정 Component를 호출해달라고 요청하는 일종의 요청 메시지



(2) 서비스(Service) : 사용자와 직접 상호작용을 하는 Activity와는 달리 화면에 표시되지 않고 백그라운드에서 작업을 수행하는 Component


- 서비스(Service)를 이용하여 Component를 구현하는 경우


해당 어플리케이션이 화면에 표시되지 않고 사용자와 상호작용하지 않는다 하더라도 백그라운드에서 기능을 계속 해야 하는 어플리케이션

ex> 음악 재생 어플리케이션


- 서비스(Service)의 구현


일반적으로 Service 클래스를 확장하여 구현 가능


onCreate(), onDestroy(), onStartCommand(), onBind() 등의 메소드를 구현하여 다양한 백그라운드 작업 처리 가능


다른 Component에서 Service를 시작하려면 startService() 또는 bindService() 메소드를 호출


Activity와 마찬가지로 startService()와 bindService() 메소드도 Intent 객체를 매개변수로 받음.



(3) 브로드 캐스트 리시버(Broadcast Receiver) : 불특정 다수를 대상으로 발송된 특정 메시지에 대해 응답할 수 있는 Component


- 메시지의 종류


시스템 상태와 관련된 시스템 공지 : 배터리 부족, 언어 변경 등


특정 어플리케이션과 관련된 공지 : 파일 다운로드 완료 등


- 브로드캐스트 리시버(Broadcast Receiver)의 기능


안드로이드 어플리케이션은 자신이 필요하다고 여겨지는 메시지에 응답할 수 있도록 Broadcast Receiver 여러개를 등록할 수 있음.


브로드 캐스트 리시버는 알림을 통해 사용자의 주의를 끌 수 있음

-> 화면을 보여주진 않지만 해당 메시지에 대한 작업을 처리하는 Activity를 실행하는 경우

-> 토스트나 다이얼로그 알림 등의 사용자 알림


- 브로드캐스트 리시버(Broadcast Receiver)의 구현


Broadcast Receiver는 일반적으로 BroadcastReceiver 클래스를 확장하여 구현 가능


BroadcastReceiver 클래스 안에 onReceive() 메소드를 구현하여 Intent 객체로 넘어오는 특정 브로드캐스트 메시지를 처리 가능


다른 Component에서 Broadcast Receiver를 직접적으로 호출할 수는 없음


브로드캐스트 메시지를 담은 Intent 객체를 sendBroadcast()나 sendOrderedBroadcast(), sendStickyBroadcast() 메소드 등을 통해 발송하여 해당 Broadcast Receiver가 응답하게 함.



(4) 컨텐트 프로바이더(Content Provider) : 어플리케이션 내의 데이터를 다른 어플리케이션과 공유할 수 있게 하는 Component


- 컨텐트 프로바이더(Content Provider)의 기능


기본적으로 어플리케이션 내의 데이터는 해당 어플리케이션에서만 접근할 수 있고 다른 어플리케이션에서는 접근할 수 없으므로 특정 어플리케이션 내에 있는 데이터를 다른 어플리케이션에서도 접근할 수 있게 하려면 Content Provider를 구현해야 함.


Content Provider는 안드로이드 어플리케이션들 간에 데이터를 공유할 수 있는 유일한 방법을 제공


- 컨텐트 프로바이더(Content Provider)의 구현


Content Provider는 자신에게 접근할 수 있도록 자신의 고유 주소, 즉 컨텐트 URI를 정의해야 함.


다른 어플리케이션들은 ContentResolver 객체를 통해 해당 컨텐트 URI에서 제공하는 공유된 데이터에 접근 가능


Content Provider는 일반적으로 ContentProvider 클래스를 확장하여 구현 가능


query(), insert(), update(), delete() getType() 등의 메소드를 구현하여 요청된 데이터 처리 작업 수행 가능


* 내장 프로바이더


- 안드로이드 플랫폼은 오디오나 비디오 , 이미지, 주소록 등 주요한 데이터 유형들에 대한 몇몇 내장 Content Provider들을 미리 준비하여 제공

- 종류 : MediaStore, CallLog, Contacts 등





2. 인텐트 (Intent)


- 어떤 Component에서 다른 Component를 호출하기 위해서 전달해야 하는 비동기식 메시지


- Intent 객체 : 안드로이드 어플리케이션 내의 Component를 호출하기 위한 메시지를 담을 수 있음.


-> 메시지에는 호출 대상 Component의 이름이 직접적으로 명시되어 있을 수도 있고, 혹은 처리해줬으면 하는 작업과 데이터 등이 들어가 있을 수도 있다.


-> 호출된 Activity가 자신을 호출한 Activity에게 결과 값을 전달할 때도 Intent 객체에 데이터를 담아 전달한다.


* 안드로이드 어플리케이션 구성요소들의 활성화

- Activity, Service, Broadcast Receiver : Intent를 통해서 호출하여 활성화 가능

- Content Provider : Intent를 사용하지 않고 ContentResolver 객체를 통해 호출되어 활성화



(1) 명시적 Intent


- 호출방식 : 호출할 Component가 무엇인지 직접적으로 Intent 객체에 정의하여 안드로이드 플랫폼으로 하여금 해당 Component를 시작하도록 요청하는 방식


- 용도 : 일반적으로 명시적 Intent는 한 어플리케이션 내에서 이미 알고 있는 내부 Component를 호출할 때 많이 사용


startActivity(new Intent(MainActivity.this, MyActivity.class));


MainActivity.this : 현재 Activity의 컨텍스트 객체,    MyActivity.class : 새로 시작할 Activity 클래스명




(2) 암시적 Intent


- 호출방식 


호출할 Component  직접적으로 지정하지 않고, 처리해야 하는 작업과 데이터, 유형 등 각종 정보를 Intent 객체에 정의하여 이를 처리할 수 있는 Component를 안드로이드 플랫폼에게 찾아달라고 요청하는 방식

-> 어떤 기능을 처리해달라는 정보만을 통해 Component를 호출


Component들은 자신이 처리할 수 있는 Intent가 무엇인지 안드로이드 manifest 파일에 <intent-filter></intent-filter>를 통해 정의할 수 있으며 이를 통해 암시적 Intent 를 수신할 수 있다.


만약 어떤 Component가 어떤 Intent Filter 도 정의하고 있지 않다면, 그것은 명시적 Intent만을 통해서 시작될 수 있다.


- 용도


외부에 있는 다양한 Component들을 호출하여 사용하려고 할 때 유용


- 장점


안드로이드 플랫폼에 내장되어 있는 핵심 어플리케이션들(이메일 클라이언트, SMS 문자메시지 및 전화걸기 프로그램 등)도 암시적 Intent를 통해서 호출되므로 사용자는 핵심 어플리케이션들을 사용자가 원하는 다른 Component들로 대체할 수 있음

(PC에서 동영상 파일을 재생할 때 Windows Media Player가 기본으로 설정되어 있지만, 이를 곰플레이어로 바꿔 쓸 수 있는 것과 동일한 방식)



Intent intent = new Intent(Intent.ACTION_DIAL, Uri.parse("tel:01012345678"));

startActivity(intent);


Intent.ACTION_DIAL : 처리해야 할 작업, Uri.parse("tel:01012345678") : 처리해야 할 데이터


이를 통해 전화걸기 어플리케이션 시작.



만약 아래와 같이 안드로이드 매니페스트(AndroidManifest.xml)에서 <intent-filter></intent-filter>를 정의한 Activity  있다면, 안드로이드 플랫폼의 기본 전화 걸기 어플리케이션이 아닌 그 Activity가 시작된다.


<intent-filter>

<action android:name="android.intent.action.DIAL"/>

<category android:name="android.intent.category.DEFAULT"/>

</intent-filter>


* 안드로이드 플랫폼이 제공하는 암시적 Intent를 아키텍처 관점에서 살펴보면, 안드로이드 플랫폼이 Loosely Coupling 방식의 Component 결합 구조를 정의하는 SOA(Service-Oriented Architecture)를 잘 수용하고 있음을 알 수 있다.



저작자 표시 비영리 변경 금지
신고
이웃추가
facebook에 글올리기

Name __

Password __

Link (Your Website)

Comment

SECRET | 비밀글로 남기기