Android 4대 컴포넌트

jihyo·2021년 6월 22일
0

Android

목록 보기
2/17

Android 앱 개발의 핵심은 컴포넌트이다. 컴포넌트를 이해해야 Android 앱 개발의 구조를 이해할 수 있다.

컴포넌트는 특별히 Android에서만 사용되는 개념은 절대 아니다. 다른 애플리케이션에도 당연히 적용되는 개념으로 애플리케이션의 구성 요소라고 볼 수 있겠다.

애플리케이션을 구성하는 단위로 Android에서는 클래스가 컴포넌트 역할을 한다. 그렇다고 모든 클래스가 컴포넌트 역할을 하는 것은 아니고 컴포넌트 클래스와 일반 클래스로 구분 짓는다.

컴포넌트 클래스와 일반 클래스의 차이
런타임 때 생명주기를 누가 관리하는가에 따라 차이가 존재한다.

  • 일반 클래스 : 앱이 실행될 때 클래스의 객체 생성부터 소멸까지 생명주기 관리를 개발자 코드에서 관리. 개발자가 임의의 목적으로 만든 클래스
  • 컴포넌트 클래스 : 생명주기를 Android 시스템에서 관리

Android 4대 컴포넌트

액티비티 (Activity)

  • 화면을 구성하는 컴포넌트이다. 예를 들어, 이메일 앱이 있다면 새 이메일 목록을 표시하는 액티비티 하나, 이메일을 작성하는 액티비티 하나, 이메일을 읽는 데 쓰는 액티비티 하나가 있을 수 있다.
  • 여러 액티비티가 함께 작동하여 짜임새 있는 사용자 환경을 구성하지만, 각자 서로 독립되어 있다.
  • 해당 앱에서 허용할 경우 다른 앱에서 해당 액티비티를 사용할 수 있다. 예를 들어, 카메라 앱이라면 이메일 앱 안의 액티비티를 시작하여 사용자가 새 이메일을 작성하고 사진을 공유할 수 있다.

서비스 (Service)

  • 백그라운드 작업을 하는 컴포넌트로, 오랫동안 실행되는 작업을 수행하거나 원격 프로세스를 위한 작업을 수행한다. (ex: 다른 앱을 사용하면서 백그라운드에서 음악 재생)
  • 화면 출력 기능이 없다.
  • 다른 컴포넌트(예: 액티비티)가 Service를 시작한 다음 실행되도록 두거나 자신에게 바인딩하여 상호작용하게 할 수도 있다.

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

  • 시스템 이벤트가 발생할 때 실행되게 하는 컴포넌트이다.
    • 화면에서 발생하는 사용자 이벤트가 아니라, 시스템에서 발생하는 특정 이벤트를 말한다. (ex: 부팅 완료, 배터리 방전, 사진 캡처 등). UI를 표시하지 않고 상태 표시줄 알림을 통해 사용자에게 보여준다.
  • 앱도 Broadcast를 시작할 수 있다. 예를 들어 다른 앱에 일부 데이터가 기기에 다운로드되었고 이를 사용할 수 있다는 것을 알리는 데 사용한다.
  • 브로드캐스트 리시버는 다른 컴포넌트로의 게이트웨이인 경우가 더 보편적이고, 극소량의 작업만 수행하도록 만들어진 경우가 많다.
  • JobService를 예약하여 시작하여 JobScheduler가 포함된 Event를 기초로 어떤 작업을 수행하게 할 수 있다.

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

  • 앱의 데이터를 공유하는 컴포넌트이다. 파일 시스템, SQLite 데이터베이스, 웹상이나 앱이 액세스할 수 있는 다른 모든 영구 저장 위치에 저장 가능한 앱 데이터의 공유형 집합을 관리한다.
  • A 앱이 자신의 데이터를 B 앱과 공유하려면 콘텐츠 프로바이더를 만들고, B 앱에서는 그 콘텐츠 프로바이더를 이용해 데이터에 접근한다. 그 예시로 카카오톡 앱에서 프로필 사진을 변경할 때 갤러리 앱을 통해 바꾸는 것이 대표적이다.

컴포넌트 구분

앞서 컴포넌트 클래스는 생명주기를 Android 시스템에서 관리한다고 했다. 관리는 시스템에서 하지만 개발자가 만들어야 하는 클래스이다. 따라서, 컴포넌트 클래스를 만들 때는 지정된 클래스를 상속받아야 하는데 서비스는 Service, 콘텐츠 프로바이더는 ContentProvider 등이기 때문에 상위 클래스를 보고 구분할 수 있다.

컴포넌트 구성

이제 컴포넌트에 대해 알았으니 어떻게 구성해야 될지 알아야 한다.

사실 컴포넌트를 어떻게 구성할 지에는 정답은 없다. 설계에 따라 달리지기 때문이다.

독립된 실행 단위

컴포넌트는 애플리케이션 안에서 독립된 실행 단위이다. 이 말은 서로 종속되지 않기 때문에 코드 결합이 발생하지 않는다는 의미이다.

컴포넌트 독립성

예시로 MainActivity에서 SubActivity로 화면 전환을 한다고 가정했을 때, MainActivity에서 SubActivity의 객체를 생성해 실행하면 될 것 같으나 불가능하다.

이유
컴포넌트의 생명주기를 Android 시스템에서 관리하기 때문에 코드에서 직접 객체를 생성해 실행할 수 없기 때문이다.

따라서, Android 시스템에 의뢰해서 시스템이 SubActivity를 실행해야 한다. 두 클래스가 서로 종속되지 않고 독립된 상태로 실행되어야 한다.

앱 실행 시점의 다양성

다른 컴포넌트를 실행시킬 때 유지되어야 하는 독립성 때문에 불편하다고 생각할지도 모른다. 그러나 그 덕분에 앱의 실행 시점이 다양해질 수 있다. 아이콘을 누르지 않고 알림 메시지를 눌렀을 때 앱이 실행되는 것이 그 예이다.

인텐트 (Intent)

  • Activity, Service, Broadcast Receiver는 Intent라는 비동기식 메시지로 활성화된다.
  • Intent는 런타임시 각 컴포넌트를 바인딩한다.
  • Intent는 Intent 객체 형태로 생성되며, 특정 컴포넌트(명시적 Intent)를 활성화할 지 컴포넌트의 특정 유형(암시적 Intent)을 활성화할 지 정의한다.

Activity와 Service에서의 Intent

  • 수행할 작업을 정의하며(예: 무언가를 보거나 보내는 작업), 작업을 수행할 데이터의 URI를 지정할 수 있다.
  • 경우에 따라 결과를 수신하기 위해 Activity를 시작할 수 있다. Activity도 Intent의 결과를 반환한다. 예를 들어 Intent를 발행하여 사용자가 개인 연락처를 선택하게 하고 이를 반환할 수 있다. 반환 Intent에는 선택된 연락처를 가리키는 URI가 포함된다.

Broadcast Receiver의 경우, Intent는 단순히 Broadcast 알림을 정의한다. 예를 들어 기기 배터리 잔량이 낮다는 것을 나타내는 Broadcast에는 배터리 부족을 나타내는 알려진 작업 문자열만 포함된다.

0개의 댓글