컴포넌트는 구성 요소라는 뜻으로,
안드로이드는 4개의 핵심 컴포넌트 (Major Components)를 제공한다.
Android의 4대 컴포넌트
- Activity (액티비티) : UI 화면 담당
- Service (서비스) : 백그라운드 처리 작업을 위해 사용
- Boradcast Receiver (방송 수신자) : 시스템에서 발생하는 각종 이벤트(브로드캐스트)를 수신
- Content Provider (콘텐츠 제공자) : 다른 애플리케이션 및 로컬 데이터를 제공
각 유형은 고유한 뚜렷한 목적을 가지고 독립적인 형태로 존재하며, 각각의 생명 주기에 의해서 실행된다.
또한 액티비티, 서비스, 브로드캐스트 리시버는 Intent(인텐트)를 통해 상호작용하며, 콘텐츠 제공자는 Content Resolver를 통해 활성화된다.
Android Component 활성화
- Intent(인텐트) : 애플리케이션 컴포넌트 간에 작업 수행을 위해 정보 전달을 하는 통신수단 역할
- Content Resolver : 앱이 Content Provider에 접근하기 위한 수단
안드로이드 기본 구성 요소
1. Activity (액티비티)
액티비티는 화면 UI를 담당하는 컴포넌트로, 사용자와 상호작용하기 위한 진입점이다.
독립된 여러 액티비티가 함께 작동하여 짜임새 있는 사용자 환경을 구성하며, 앱을 실행하면 가장 먼저 보이는 화면이 바로 액티비티라고 할 수 있다.
화면에 포커싱 되어 사용자와 상호작용하며, 하나의 단일 화면에 모든 사용자 인터페이스(Interface) 구성 요소 (버튼, 텍스트 등)이 포함되어 있다.
- 사용자 환경에 지장을 주지 않으면서 방향 변경이 원활하게 이뤄진다.
- 활동 전환 과정에서 사용자 데이터가 손실되지 않는다.
- 시스템이 적절한 때에 정상적으로 프로세스를 종료한다.
자바나 코틀린 소스에서 AppCompatActivity (안드로이드 하위 버전을 지원하는 Activity) 클래스를 상속받고 있어야 액티비티로 이용할 수 있으며, 어떤 애플리케이션이든 반드시 하나는 존재하여야 한다.
또한 한 번에 하나의 액티비티만 띄울 수 있으므로, 2개 이상의 화면 분할이 필요한 경우 Fragment를 사용하여 분할할 수 있으며 Intent를 통해 액티비티 간의 데이터를 주고받을 수 있다.
만약 이전 액티비티를 종료하지 않을 경우 스택 구조로 쌓이게 되며, 작업의 모든 활동은 백그라운드에 있는 동안 중지되지만 작업의 백스택은 그대로 유지되므로 사용자가 [뒤로 가기]를 선택하여 상위 액티비티를 종료할 경우 이전 액티비티로 돌아가 중단된 활동을 계속 이어나갈 수 있다.
더 자세한 동작 방식은 아래에서 확인할 수 있다.
https://developer.android.com/guide/components/activities/tasks-and-back-stack
2. Service (서비스)
일반적으로 화면 없이 동작하는 프로그램을 뜻하며, 백그라운드 프로세스 (Background Process)라고도 한다.
화면이 종료되면 동작하지 않는 액티비티와 달리, 서비스는 백그라운드에서 실행되므로 화면과 상관없이 계속 동작할 수 있다. 백그라운드에서 오래 실행되는 작업을 수행할 수 있는 애플리케이션 구성요소이므로 사용자 인터페이스를 제공하지 않는다.
서비스에는 세 가지 유형이 존재한다.
1) 포그라운드
- 사용자에게 잘 보이는 몇몇 작업을 수행한다. ex) 음악 재생
- 알림(Android가 앱의 UI 외부에 표시하는 메시지)을 표시해야 한다.
- 사용자가 앱과 상호작용하지 않을 때도 계속 실행된다.
2) 백그라운드
- 사용자에게 직접 보이지 않는 작업을 수행한다.
참고) 앱이 API 레벨 26 이상을 대상으로 한다면 앱이 포그라운드에 있지 않을 때, 시스템에서 백그라운드 서비스 실행에 대한 제한을 적용한다. 이와 같은 경우에서는 대부분 앱이 예약된 작업을 사용해야 한다.
3) 바인드
- 바인딩된 서비스는 클라이언트-서버 인터페이스를 제공하여 구성 요소가 서비스와 상호작용하게 한다.
- 이를 통해 결과를 받을 수도 있고, 이와 같은 작업을 여러 프로세스에 걸쳐 프로세스 간 통신(IPC)으로 수행할 수도 있다.
- 바인딩된 서비스는 또 다른 애플리케이션 구성 요소가 이에 바인딩되어 있는 경우에만 실행된다.
- 여러 개의 구성 요소가 서비스에 한꺼번에 바인딩될 수 있지만, 이 모든 것에서 바인딩이 해제되면 해당 서비스는 소멸된다.
서비스는 백그라운드에서 실행될 수 있는 구성 요소일 뿐이고, 이는 사용자가 애플리케이션과 상호작용하지 않아도 관계없이 해당되므로 필요한 경우에만 서비스를 사용해야 한다. 또한 서비스를 사용하는 경우 기본적으로 애플리케이션의 기본 스레드에서 계속 실행되므로 서비스가 집약적이거나 차단 작업을 수행하는 경우 여전히 서비스 내에 새 스레드를 생성해야 한다.
3. Broadcast Receiver (방송 수신자)
특정한 상황을 제외하고 대다수의 브로드 캐스트는 시스템(안드로이드 OS)에서 발생하며, 각종 이벤트와 정보를 받아와 핸들링한다.
시스템 브로드캐스트는 이벤트를 수신하도록 신청한 모든 앱에 전송된다. (1:N)
브로드 캐스트 자체도 앱을 시작할 수 있는 진입점 중 하나이기 때문에 현재 실행되고 있지 않은 앱에도 시스템이 브로드 캐스트를 전달할 수 있다. 예를 들어 일정 시간이 되면 알람이 울리는 이벤트를 예약할 경우, 예약 시간까지 앱이 실행되고 있지 않아도 시스템이 브로드 캐스트를 통해 상태 표시줄 알람을 표시하여 사용자에게 이벤트의 발생을 알릴 수 있다.
앱은 두 가지 방식으로 브로드캐스트를 수신할 수 있다.
1) 정적 브로드캐스트 : manifest에 선언된 수신자
2) 동적 브로드캐스트: 컨텍스트에 등록된 수신자
안드로이드 플랫폼에 따라 작동 방식에 일부 차이가 있으니 주의해서 사용해야 한다.
https://developer.android.com/guide/components/broadcasts?hl=ko#changes-system-broadcasts
4.Content Provider (콘텐츠 제공자)
콘텐츠 제공자는 애플리케이션이 자체적으로 저장된 데이터, 다른 앱이 저장한 데이터에 대한 액세스 권한을 관리하도록 돕고 다른 앱과 데이터를 공유할 방법을 제공한다.
기본적으로 앱은 애플리케이션 내 자신의 정보만을 볼 수 있다. 다른 앱에서 모바일에 저장된 개인정보를 마음대로 열람할 수 있다면 보안상에 큰 문제가 생길 수 있기 때문이다. 하지만 갤러리에서 사진을 가지고 와야 하는 등 로컬 데이터에 접근해야 하는 경우가 있는데, 이때 안전하게 콘텐츠를 제공받을 수 있도록 하는 컴포넌트가 Content Provider인 것이다.
콘텐츠 제공자는 한 프로세스의 데이터에 다른 프로세스에서 실행 중인 코드를 연결하는 표준 인터페이스로,
데이터를 캡슐화하고 데이터 보안을 정의하는 데 필요한 매커니즘을 제공함으로써 다른 애플리케이션이 앱 데이터에 안전하게 액세스 하여 이를 수정할 수 있도록 허용한다.
구조화된 데이터(SQLite 관계형 데이터베이스 등) 및 비구조화된 데이터(이미지 파일 등)를 포함한 다양한 데이터 저장소 소스에 대해 접근 가능하며, 특히 데이터 액세스 권한에 대한 세분화된 제어 기능을 제공한다.
이때 액티비티, 서비스, 브로드캐스트 리시버와는 달리 콘텐츠 제공자는 인텐트로 활성화되지 않는다. 대신 Content Resolver에 URI를 전달함으로써 Content Provider의 데이터에 접근할 수 있게 된다.
이렇게 되면 콘텐츠 제공자와 정보를 요청하는 구성 요소 사이에 추상화 계층이 하나 남으므로 보안에 더욱 안전하다.
URI (Uniform Resource Identifier)
URI는 Content Provider에서 제공하는 데이터에 접근하기 위한 주소이다.
주로 "content://패키지명//경로/아이디"형식으로 지정되고, 일반적으로 접근할 대상 앱에서 정의된다.
이 URI는 authority로 불리며 Content Provider를 직접 만들 때는 AndroidManifest.xml에 기술한다.
Reference
'Mobile Develop > Android' 카테고리의 다른 글
adb 환경 변수 설정 방법 / 주요 명령어 정리 (0) | 2024.01.13 |
---|---|
[Android] Activity Lifecycle (액티비티 생명주기) (0) | 2024.01.13 |
org.jetbrains.kotlin.backend.common.BackendException: Backend Internal error: Exception during IR loweringFile being compiled (0) | 2024.01.13 |
Dependency 버전 오류 해결하기 (0) | 2024.01.13 |
[Android] Duplicate resources 에러 해결하기 (0) | 2023.06.09 |
댓글