본문 바로가기
Android

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

by Saerong2 2020. 9. 18.

 

# 앱 구성 요소

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

 

안드로이드 4대 컴포넌트 (출처 - *사진1)

앱 구성 요소(4대 컴포넌트)는 안드로이드 앱에서 많은 feature들 중에서도 필수적인 구성 요소입니다. 안드로이드 어플리케이션은 결국 안드로이드 프레임워크위에서 작동하는 컴포넌트들의 집합입니다. 위의 네 가지 컴포넌트들은 App Manifest에 등록되어 있기 때문에 안드로이드 시스템에서 각각의 컴포넌트들을 인지할 수 있습니다. 어쩌면 이 글을 읽고 계신 분들도 소스코드를 빌드하고 에러가 나서 Manifest에 컴포넌트를 추가해 준 경험이 있을지도 모르겠네요.

 

그런데 안드로이드에는 Acitivty, Service, BroadcastReceiver, ContentProvider 이외에도 Fragment, Thread, Coroutine 등 많은 것들이 있는데 어째서 이 네가지는 4대 컴포넌트라고 따로 불릴만큼 특별하고 필수적일까요?

 

 

 

# 진입점 (Entry Point)

 자바가상머신(JVM)은 자바 프로그램을 시작할 때, 프로그램의 진입점에 해당하는 main함수를 호출합니다. 안드로이드에서는 자바 프로그램과 같이 JDK로 빌드하고 언어도 같은데 왜 main함수가 따로 없을까요? 그 이유는 위의 네 가지 앱 구성요소가 사용자나 시스템이 앱에 들어올 수 있는 진입점이기 때문이며 실제로 main함수는 안드로이드 프레임워크 내부 android.app.ActivityThread에 구현이 있습니다.

 

각 컴포넌트가 어떻게 진입점이 될 수 있는지 간단히 예를 들어보겠습니다.

 

## 액티비티

길을 찾기 위해 지도 앱의 아이콘을 누르게 되면 앱이 실행되며 초기 액티비티로 진입하게 됩니다.

액티비티는 사용자와 상호작용을 하기 위한 진입점인 것이죠. 매니페스트 파일에서 LAUNCHER에게 정보를 주는 인텐트 필터를 통해서 해당 액티비티를 어플리케이션의 진입점으로 만들 수 있습니다.

 

## 서비스

음악을 듣거나 데이터를 동기화하는 것은 모두 백그라운드에서 서비스를 통해 이루어집니다.

서비스는 여러가지 이유로 백그라운드에서 앱을 실행시키기 위한 진입점인 것이죠.

 

## 브로드캐스트 리시버

아침마다 우리는 짜증나는 알람앱 덕분에 늦지 않고 일어날 수 있습니다. 이는 알람앱에서 시스템에 특정 시간에 알람이 울리도록 요청을 하고 그 시간이 되면 시스템이 브로드캐스트 알림을 함으로써 알람 앱 내부의 브로드캐스트 리시버가 이 알림을 받아 알람앱이 울릴 수 있는 것입니다. 따라서 브로드캐스트 리시버 역시 앱으로 들어갈 수 있는 진입점입니다.

 

## 컨텐츠 프로바이더

 메신저 앱에서 내 연락처를 동기화 한다던가, 알람 앱에서 시끄러운 음악을 고른다던가 할 때는 컨텐츠 프로바이더를 통해서 데이터에 접근을 할 수 있습니다. 쿼리를 할 수도 있고, 권한이 있다면 수정을 할 수도 있죠. 메신저 앱에서 내 연락처 앱을 컨텐츠 프로바이더를 통해서 진입한다고 볼 수 있습니다.

 

 

# 옛날 옛적에..

여기서 안드로이드의 설계 철학을 엿볼 수 있습니다.

초기 안드로이드는 게임을 하다가 전화도 받고 알림도 받는 등 어플리케이션 간의 이동이 빈번하게 일어날 것이기에 이러한 것들을 잘 핸들링 할 수 있게 설계하는 것이 목표였습니다. 그래서 안드로이드의 시스템 디자인은 어떤 앱이든 다른 앱의 구성요소를 실행 시작할 수 있다는 독특한 측면이 있습니다. 예를 들어 나의 게임 앱에서 다른 카메라 앱의 캡처 액티비티를 실행해서 사진을 찍고 그 사진을 나의 앱에서 받아서 사용할 수 있는 것이죠.

 

안드로이드에서 기본적으로 모든 앱은 앱 자체의 Linux 프로세스에서 실행됩니다. 안드로이드 시스템은 앱의 진입점에 해당하는 네 가지 구성요소 중 어느하나라도 실행해야 하는 경우 프로세스를 시작하고, 더 이상 필요 없거나 안 쓰인지 오래되어 우선순위가 낮은데 시스템이 메모리를 요구하는 경우 프로세스가 종료됩니다.

 

따라서, 나의 게임앱이 카메라앱의 액티비티를 시작하면, 시스템이 카메라 앱에 대한 프로세스를 시작하고(이미 실행되지 않은 경우), 해당 액티비티에 필요한 클래스들을 인스턴스화 하여 메모리에 올리게 됩니다.

 

이때, 나의 앱과 카메라 앱은 각각 별개의 프로세스 에서 실행되고 있고 시스템이 다른 앱에 대한 접근 권한을 갖기 때문에, 실제로 나의 앱에서 카메라 앱의 구성요소를 직접 활성화 할 수 없고 이는 시스템을 통해서만 할 수 있습니다.

그렇기 때문에 다른 앱에 있는 구성요소를 활성화 하기 위해서는 시스템에게 "특정 구성 요소를 시작해줘!" 라는 의도를 밝혀야 합니다. 이에 해당하는 것이 인텐트(intent)이며 인텐트를 통해서 시스템은 우리의 앱을 대신하여 다른 구성요소를 실행하게 됩니다.

 

시스템을 통해 다른 앱의 컴포넌트를 실행시키는것의 익숙한 예로는 지도의 정보를 메신저에 공유하는것이 있겠죠?

 

 

 

 

# 인텐트 (Intent)

 

다른 액티비티의 호출에 사용되는 인텐트 (출처 - *사진2)

 위에서 다른 앱의 구성요소의 활성화를 요청할 때 시스템에게 인텐트를 통해 의도를 전달한다고 했습니다. 하지만 다른 앱으로의 요청 뿐만 아니라 하나의 앱 안에서도 구성 요소 간 활성화를 요청할 때는 인텐트라는 비동기식 메시지를 이용해야합니다. 이는 각 구성요소를 시스템이 관리하기 때문에 구성요소 간에 직접 요청할 수 없고 시스템에게 요청해야 하는 것이죠. 의도하는 인텐트 정보를 시스템이 알아들을 수 있는 포맷으로 클래스를 정의한 것이 Intent 클래스 입니다. 다른 구성요소로 어떤 값을 넘길 때 Intent 인스턴스를 만들어서 안에 값을 집어 넣고 전달할 수 있는 것입니다.

다만, 네 가지 구성 요소 중에서 컨텐츠 프로바이더는 보안의 이유로 인텐트로 활성화 되지 않고 ContentResolver가 query()요청을 보내면 활성화 됩니다.

 

 

 

 

# 매니페스트 파일 (Manifest file)

 안드로이드 스튜디오에서 new activity를 통해 액티비티 파일을 새로 만들면 자동으로 매니페스트 파일에 새로 만든 액티비티가 등록됩니다. 하지만 빈 파일로 생성하여 액티비티 또는 서비스 클래스를 만들면 누구나 한 번쯤은 아래와 같은 에러 메세지를 봤을 것 입니다. 혹은 매니페스트에 리시버를 등록 안 해서 삽질을 했던 경험도 있을 것이구요.

시스템 : 너가 사용한 이 액티비티는 정체가 뭐야? manifest에 없던데?

 안드로이드 시스템은 앱의 구성 요소를 실행 할 때, 우선적으로 앱의 매니페스트 xml 파일을 읽어서 해당 구성요소가 존재하는지 확인 합니다. 네 가지 구성요소의 실행은 모두 시스템에서 관리하기 때문이죠. 그렇기에 우리는 앱 안에 들어 있는 모든 구성요소를 매니페스트 파일에 선언해 주어야 합니다. 이 외에도 앱에서 요구하는 모든 권한과 최소 API레벨, 카메라와 같이 앱에서 요구하는 하드웨어 등에 대해서도 선언해 주어야하죠. 마치 시스템에게 "내 앱은 이러이러한 것이 있으니 잘 살펴줘!"라고 부탁하는 것 같습니다.

??? : "시스템아 잘 들어, 내 앱은 카메라 권한이 필요하고, 자동 포커스 기능을 사용할거야! 내 어플리케이션의 이름은 AlarmYouNeedApplication이고 액티비티는 ...가 있고 서비스는 ... 리시버는 ..."

 

 

# 정리

글을 마무리하며 간단히 정리해보겠습니다.

안드로이드 앱은 네 가지 구성요소를 통해 실행되며 이들은 시스템에 의해 관리됩니다. 시스템은 앱 안에 자신이 관리해야할 구성요소를 관리하기 위해 매니페스트 파일에 선언된 내용을 봅니다.

한 구성요소에서 다른 구성요소를 활성화 할 때는 의도하는 바를 인텐트 객체에 담아 시스템에게 요청하고 시스템이 이를 전달하여 처리해주는 방식으로 이루어집니다.

 

 

+ 안드로이드에 관심이 있으시다면 아래 테크콘 영상은 꼭 챙겨보시길 강추 합니다.

 

참고한 자료

https://developer.android.com/guide/components/fundamentals?hl=ko#Components

 

애플리케이션 기본 항목  |  Android 개발자  |  Android Developers

Android 앱은 Kotlin, Java, C++ 언어를 사용하여 작성할 수 있습니다. Android SDK 도구는 모든 데이터 및 리소스 파일과 함께 코드를 컴파일하여 하나의 APK를 만듭니다. Android 패키지는 접미사가 .apk인 아

developer.android.com

https://tv.naver.com/v/9329746/list/486582

 

TECH CONCERT: MOBILE 2019 - 쪼개지고 나누어지는 안드로이드

NAVER Engineering | 내용 다양성은 안드로이드 생태계의 핵심 가치입니다. 안드로이드 디바이스 종류는 정말 다양하며, 5G등 새로운 모바일 기술은 오픈된 안드로이드 생태계를 기반으로 빠르게 발��

tv.naver.com

*사진1 - https://data-flair.training/blogs/android-application-components/

*사진2 - https://en.proft.me/2017/04/5/getting-started-explicit-implicit-and-pending-inte/   

 

 

댓글