: : Kotlin

안드로이드(Android) 4대 컴포넌트(구성요소)

Jay.P Morgan 2023. 11. 9. 23:58

  안드로이드(Android) 4개의 컴포넌트(구성요소)

 

컴포넌트(Component)란?

  - 프로그래밍에 있어 재사용이 가능한 각각의 독립된 모듈

안드로이드의 4대 컴포넌트

  1. Activity (액티비티)
  2. Service (서비스)

  3. Broadcast Receiver (방송 수신자)

  4. Content Provider (콘텐츠 제공자)

 

이 네 가지 컴포넌트들은 각각 독립적인 형태로 존재하며, 고유의 기능을 수행한다.

또한 각 컴포넌트들은 아래와 같이 Intent를 통해서 서로 상호작용 한다.

 

 

그렇다면 Intent가 무엇이길래 넷 사이에 존재할까?

  - 애플리케이션 컴포넌트 간에 작업 수행을 위한 정보 전달 역할을 한다. (통신수단)

  달리 표현하면, "하나의 액티비티가 다른 액티비티를 실행할 수 있는 메시지 시스템" 이라 할 수 있다.

 

Intent는 실행되는 방향에 따라 단방향, 양방향으로 나뉜다.

 

 

Intent의 가장 간단한 사용 예는 화면(Activity) 전환에서 볼 수 있다.

 

먼저, 우리가 Activity이동을 할 때에는 먼저 Intent객체를 생성해주는데, 이때 다음 Activity의 정보를 넣어준다.

val intent = Intent(context, NextAcitivty::class.java)
startActivity(intent)

이러한 방식은 명시적 인텐트(Explicit Intent)라고 한다.

 

또한 우리가 안드로이드 앱을 개발하면서 화면을 전환할 때 값을 가장 쉽게 전달할 수 있는 방법은

Intent에 우리가 원하는 값과 키워드를 put해서 이를 다른 Acitivity에서 get하는 방법이다.

 

이때 우리는 넘어간 Activity에서 getIntent메소드를 사용함으로써 이 값이 들어있는 intent를 받을 수 있다.

즉, Intent는 컴포넌트 A가 컴포넌트 B를 호출할 때 필요한 정보들을 담고 있는 장치라고 볼 수 있다.

 

 

Intent는 다시 두 가지 종류로 구분되는데 첫 번째는 위에서 말한 명시적 인텐트, 두 번째는 암시적 인텐트(Implicit Intent)이다.

이 둘은 형변환시 컴포넌트 이름을 지정해주는지, 지정해주지 않고 Intent에 포함된 정보를 기반으로 시스템이 찾아서 하는지의 차이다.

 

 

자 이렇게 Intent가 뭔지에 대해 간략하게 알아봤으니 다시 본론으로 돌아가서 4대 컴포넌트에 대해서 자세히 들어가 보자.

 

 

  1. Acitivty(액티비티)

 

액티비티(Activity)란?

  - 사용자가 애플리케이션과 상호작용을 하는, 실제 사용자에게 보이는 화면을 의미하며 UI 화면을 담당하는 컴포넌트이다.

 

  4대 컴포넌트 중 가장 많이 사용하며, 모든 안드로이드 애플리케이션은 반드시 하나 이상의 액티비티를 포함하여 이루어진다.

  (그래서인지 Android Studio에서 프로젝트를 생성하면 맨 먼저 MainActivity가 생성됨)

 

  2개 이상의 액티비티를 동시에 디스플레이 할 수 없다. 대신, 프래그먼트(Fragment)를 추가하여 화면을 분할하여 디스플레이 가능하다.

  또한, Intent를 통해 다른 애플리케이션의 화면도 호출할 수 있다.

 

  그리고 액티비티는 1개 이상의 View 혹은 ViewGroup을 포함한다.

  View는 화면에서 표현되는 버튼, 이미지 등을 말하며, ViewGroup은 레이아웃 등이라 말할 수 있다.

 

  액티비티는 Life Cycle 관련 메서드들을 재정의하여 원하는 기능들을 구현할 수 있다.

  액티비티는 매니페스트파일에 등록 되어 있어야 한다.

 

 

   2. Service(서비스)

 

서비스(Service)란?

  - 백그라운드(Background)에서 실행되어 작업을 처리하는 프로세스

 

액티비티가 눈에 보이는 화면에서 상호작용을 하는 것과는 달리, 서비스는 별도의 화면(UI)를 가지지 않아서 사용자와 직접 상호작용하지 않는다. 

 

UI를 띄워놓지 않아도(App을 종료하여도) 이미 시작된 서비스는 백그라운드에서 계속 동작한다.

만보기 App을 예로 들면, 우리가 App을 사용하여 액티비티에서 설정이나 이동 거리, 걸음 수 등을 볼 수 있지만,

우리가 화면을 끄고 걸어 다녀도 만보기 App에선 걸음 수를 계속해서 측정한다. 

또한, 뮤직 플레이어 같은 경우도 백그라운드에서 계속해서 음악을 재생한다던지, 다른 작업을 하면서 파일을 다운받을 때 서비스를 사용한다.

 

별도의 스레드(Thread)가 아닌 메인 스레드에서 동작한다.

액티비티와 동일하게 UI스레드라고 불리는 동일한 애플리케이션 스레드로 실행되므로, 실행 시 서비스 내에서 별도의 스레드를 생성하여 작업을 처리해야 한다. 또한네트워크(Network)와 연동하여 데이터를 받아오는 것이 가능하다.

 

 

 

   3. Broadcast Receiver(방송 수신자)

 

방송 수신자(Broadcast Receiver)란?

  - 안드로이드OS에서 발생하는 각종 이벤트와 정보를 받아와 반응하여 처리하는 컴포넌트이다.

  - 메세지를 여러 객체하게 전달하는 방법을 의미한다.

 

안드로이드 디바이스의 특수한 상황에 대응하기위해 수신기(Broadcast Receiver)를 통하여 디바이스의 상황을 감시하다가 이벤트가 발생하면 해당 이벤트에 맞게 정의해둔 작업들을 수행하여 대응한다.

(ex. 디바이스 부팅시 앱 초기화, 네트워크 끊김 등의 특수한 이벤트에 대한 처리, 배터리 부족 알림, 문자 수신과 같은 정보를 받아 처리할 필요가 있을 때 등)

 

브로드캐스트는 거의 대부분 UI를 가지지 않으며, 특정 상황을 제외하고는 안드로이드 시스템 전체에서 동작한다.

 

그리고, 디바이스에서 발생하는 일 중 App에서 알아야 하는 상황(이벤트)이 발생하면 방송해준다.

Broadcast(방송)이라는 말 그대로 안드로이드 시스템에서는 이벤트가 발생하면 해당 이벤트에 대한 정보를 기기 내의 모든 App에 Broadcast한다. Application들은 이 메시지를 받아서 처리할 수 있는 Broadcast Recevier가 있다면 해당 작업을 수행할 수 있다.

 

또한 하나의 Application에서 Broadcast하여 다른 Application에 동작을 수행하도록 할 수도 있다.

 

 

 

   4. Content Provider(콘텐츠 제공자)

 

콘텐트 제공자(Content Provider)란?

  - 데이터를 관리하고 다른 애플리케이션 데이터를 제공해주는 컴포넌트이다.

 

즉, DB, 웹, 파일 시스템 등과 같이 데이터를 저장하고, 불러와서 사용할 수 있는 시스템들을 말한다.

 

콘텐츠 프로바이더는 특정한 어플리케이션이 사용하고 있는 데이터베이스를 공유하기 위해 사용된다.

애플리케이션 간의 데이터 공유를 위해 표준화된 인터페이스를 제공하며, SQLite DB / Web / 파일 입출력 등을 통해서 데이터를 관리한다.

데이터의 Read(읽기), Write(쓰기)에 대한 퍼미션이 있어야 앱에 대한 접근이 가능하며,

DB에서 흔히 쓰이는 CRUD(Create, Read, Update, Delete) 원칙을 준수한다.

  (어떻게 보면 Content Provider는 Server와 비슷한 역할을 하는 것 처럼 보인다.)

 

콘텐츠 프로바이더는 외부 앱이 현재 실행중인 앱 내에 있는 DB에 함부로 접근하지 못하게 할 수 있고, 공개/공유하고 싶은 데이터를 선택적으로 공유할 수 있도록 할 수 있다. 그리고, 콘텐츠 프로바이더를 통해 다른 애플리케이션의 데이터도 쿼리하거나 변경할 수 있다.

 

앱끼리 서로 작은 데이터를 Intent로 공유가 가능하지만, 콘텐트 프로바이더는 음악 또는 사진파일과 같은 용량이 큰 데이터를 공유하는데 적합하다.

 

콘텐츠 프로바이더는 Life Cycle을 가지고 있지 않다.

 

예시

 

`연락처`가 Content Provider를 통해서 공유해야 할 데이터가 된다고 볼 수 있을 것이다.

연락처는 기기에 저장(요즘은 Google계정에 연락처 정보가 저장되더라)되지만 카카오톡을 들어가 보면 우리가 기기에 저장한 연락처와 동기화를 할 수 있는 걸 볼 수 있다.

이런 경우가 바로 ContentProvider를 통해 카카오톡이 우리의 연락처에 대한 `데이터` 공유받아서 사용한 것이다.

 

당연히 이런 ContentProvider를 사용하려면 권한을 획득해야 한다.

누군가가 내 허락도 없이 내 연락처 또는 정보들을 마음대로 가져다가 쓰면 안 될 거 아닌가?

 

이러한 부분의 보안적인 이슈들 때문에 카카오톡 같은 Application을 처음 설치하면

우리가 당신의 연락처(전화번호부)에 접근을 해서 데이터를 써도 되겠습니까?라고 물어보는 것이다.

': : Kotlin' 카테고리의 다른 글

Android 플랫폼 아키텍처  (1) 2023.10.16