본문 바로가기

Android 공부

3. 안드로이드 기본 구성요소

이번 게시물은 안드로이드의 기본 구성요소, 흔히 4대 컴포넌트라고 불리는 요소들에 대한 내용이다. 그 전에 안드로이드의 기본적인 운영에 대해서 살펴보자면, 안드로이드 운영체제는 기본적으로 멀티 유저 리눅스 시스템으로, 쉽게 말해 각 어플은 각기 다른 사용자로 인식된다. 서로 다른 사용자로 인식되기 때문에 기본적으로 각 어플은 자신의 어플에 필요한 구성 요소에만 접근 권한을 가지고 그 이상의 어플에는 권한을 가지지 못하는 것이 기본적인 설정이다. 

 


 

본격적으로 기본 구성 요소를 살펴보면, 각 구성요소는 시스템이나 사용자가 어플에 들어올 수 있는 진입점에 해당한다. 엑티비티, 서비스, Broadcast Receiver, 콘텐츠 제공자가 이 기본 구성요소에 해당한다. 

 

 

엑티비티

사용자와 상호작용하기 위한 진입점으로 사용자 인터페이스를 포함한 화면 하나를 의미한다. 각 엑티비티가 모여서 사용자 환경을 구성하지만 모두 독립되어있다. 그렇기 때문에 다른 어플에서 권한을 가질 경우 다른 어플의 하나의 엑티비티를 시작하거나 접근하는 것이 가능하다. (ex. 메세지 앱에서 카메라 앱으로 접근 권한을 가질 경우 카메라 앱의 특정 엑티비티를 시작할 수 있다.)

 

 

서비스

엑티비티와는 조금 다르게 사용자 인터페이스를 제공하지 않고, 백그라운드에서 앱을 계속 실행하기 위한 다목적 진입점에 해당한다. 서비스에는 포그라운드, 백그라운드, 바인드 세 가지의 유형이 있다. 

 

 

Broadcast Receiver

시스템이 정기적인 사용자 플로우 밖에서 이벤트를 어플에 전달하도록 지원하는 구성요소에 해당한다. 현재 실행되지 않는 앱에도 전달할 수 있다는 특징이 있으며 대표적으로 배터리 부족, 사진을 캡쳐할 경우 나오는 요소가 있다. 

 

 

콘텐츠 제공자

다른 모든 영구 저장 위치에 저장 가능한 앱 데이터의 공유형 집합을 관리한다. 예를 들어 콘텐츠 제공자가 허용할 경우, 그 권한을 가진 앱이라면 연락처에서 특정 인물의 정보를 읽고 쓸 수 있다. 

 

 

이렇게 네 가지의 구성요소 (컴포넌트)가 기본적인 구성요소에 해당하며 안드로이드 상에서 진입점이 된다. 그렇다면 이러한 구성요소를 활성화하는 방법은 무엇일까? 

 

많이 들어봤겠지만, 바로 Intent라는 비동기식 메세지가 이에 해당한다. 

 

Intent는 런타임에서 각 구성요소를 서로 바인딩하는데 각 구성요소를 활성화하기 위해서는 각기 다른 method가 존재한다. 하지만 여기에도 예외는 있다. 4개의 컴포넌트 중 콘텐츠 제공자는 보안 목적으로 Intent가 기본적으로 활성화되지 않는다. 

공식문서에 따르면 각 method는 다음과 같다. 

 

  • 액티비티를 시작하거나 새로운 작업을 배정하려면 Intent를 startActivity() 또는 startActivityForResult()에 전달 (액티비티가 결과를 반환하기를 원하는 경우).
  • Android 5.0(API 레벨 21) 이상에서는 JobScheduler 클래스를 사용하여 작업 예약 가능. 초기 Android 버전의 경우 Intent를 startService()에 전달하여 서비스를 시작. Intent를 bindService()에 전달하여 서비스에 바인딩 가능.
  • sendBroadcast(), sendOrderedBroadcast(), 또는 sendStickyBroadcast()와 같은 메서드에 Intent를 전달하면 브로드캐스트를 시작 가능.
  • 콘텐츠 제공자에 쿼리를 수행하려면 ContentResolver에서 query()를 호출하면 됨.

 

지금까지 설명한 기본 구성요소는 메인함수로, 앱이 시작될 수 있는 함수에 해당한다고 보면 된다. 어떤 구성요소가 어떻게 사용되었는지를 알려주는 안드로이드만의 문서가 바로 Android Manifest이다. 내가 어떤 어플리케이션 컴포넌트를 가지고 있는지 다른 어플도 알 수 있도록 적어둔 문서로 앱의 경계를 넘어서 동작할 수 있도록 하는 안드로이드만의 특성이다. Manifest에 대한 설명은 따로 하나의 게시물로 정리할 예정이다. 

 

이번에는 각 구성요소가 어떤 의미를 가지는지에 대해 간단하게 살펴보았다면 다음 게시물에서는 각 구성요소의 심화 개념을 소개하고 이어서 그 수명주기를 정리할 예정이다.

'Android 공부' 카테고리의 다른 글

6. 안드로이드 context  (0) 2023.01.08
5. 안드로이드 Singleton 패턴  (0) 2023.01.06
4. 안드로이드 Activity - 생명주기  (1) 2023.01.06
2. 비정상 종료와 ANR  (0) 2022.12.29
1. Gradle (그레이들) 에 대하여  (0) 2022.12.27