본문 바로가기

TIL

[TIL] Android 4가지 컴포넌트와 Intent 개념

Topic =  Android Component와 Intent - 암시적 인텐트, 명시적 인텐트 개념에 대해서 학습 + 간단한 예제

 

 


 

 

Android 4대 컴포넌트

 

 

 

Android 4대 컴포넌트란?

 

 

Android App 컴포넌트는 Activity, Service, Content Provider, Broadcast Receiver로 이루어져 있다. 각각의 컴포넌트는 앱 안에서 독립적인 고유의 기능, 실행 단위를 갖으며 서로 상호작용하여 앱의 다양한 기능을 제공한다. 4대 컴포는트 각각의 특징과 역할을 예지를 통해 확인하며 어떠한 상호작용으로 어떠한 기능을 제공하는지 알아보자.

 

 

Activity

 

Activity는 사용자 인터페이스를 담당하는 컴포넌트로 사용자와 시각적으로 상호작용 하는 로그인 화면, 홈 화면 등이 액티비티로 구성되어있다. 액티비티는 다른 액티비티와 상호 작용하여 화면 전환을 수행하고, 다른 앱의 액티비티를 호출하여 다른 앱과의 상호작용을 가능하게 한다.

  • Activity는 1개 이상의 View나 ViewGroup 으로 이루어져 있으며 Fragment를 통해 여러 Fragment들을 동시에 화면에 띄우는 것은 가능하나, 사용자가 동시에 2개 이상의 Activity를 상호작용할 수는 없다.

∴ Activity - 화면

 

 

 

Service

 

Service는 백그라운드에서 실행되는 구성요소로 UI 적 요소를 가지고 있지 않다. 주로 백그라운드에서 오래 실행되는 작업이나 네트워크 통신 등을 처리하는 데에 사용된다. Service의 특징으로는 사용자가 앱을 사용하지 않을 때에도 동작하며, 다른 컴포넌트와 상호작용하여 음악 재생, 의치 정보를 추적하는 등의 앱 기능을 확장할 수 있다.

 

앱 전체를 백그라운드 상태로 전환하는 것 뿐만 아니라 앱 사용 내에서도 사용자와 액티비티 간의 상호작용을 차단하지 않고 네트워크를 통해 데이터를 가져오거나, 백그라운드에서 일부 데이터를 동기화하는 등 작업 또한 Service를 통해 이루어진다.

 

∴ Service - 백그라운드에서 실행되는 기능

 

 

 

Content Provider

 

Content Provider는 파일 시스템, SQLite DB, 웹상이나 앱이 액세스 할 수 있는 다른 모든 영구적인 저장 위치에 저장 가능한 앱 데이터의 집합을 관리하며, 관리하는 데이터인 DB 파일, 네트워크 등 다양한 형태의 데이터를 다른 앱이나 앱 내의 다른 컴포넌트와 공유할 수 있는 기능을 제공하는 역할을 한다. 다른 앱은 Content Resolver를 통해 데이터를 읽고 쓸 수 있는 등 데이터 핸들링,처리할 수 있다.

 

Content Resolver는 Content Provider와 상호 작용하는 데 사용하는 개체로 다른 앱 또는 앱 내의 Content Provider에 액세스하여 데이터를 조회, 추가 , 수정, 삭제할 수 있다. 조금 더 구체적인 특징에 대해서도 확인해보자.

  • Content Provider와 통신하기 위한 표준화된 인터페이스를 제공한다.
    • Content Provider의 데이터를 조회하는 데 사용되고 결과를 Cursor 객체로 반환하는 query() 메서드, insert(), update(), delete() 와 같은 인터페이스를 제공한다.
  • Content Provider의 데이터를 URI를 통해 식별하고, 데이터의 CRUD 작업을 수행한다.
  • Content Provider에 대한 데이터 액세스 권한을 요청하고 데이터 접근 권한을 통해 보안을 제어할 수 있다.
  • Content Resolver는 Content Provider의 데이터 변경 알림을 수신하여 데이터 변경 사항을 실시간으로 감지하여 반영할 수 있다.

✔️ Content Provider가 사용 되는 경우 - 일반적으로 앱 내에서의 데이터 이동, 관리의 경우 SharedPreference, Room DB, ViewModel과 LiveData가 주로 사용되고 데이터를 네트워크 요청을 통해 가져오는 경우 REST API 및 SDK를  Content Provider를 활용한 경험이 많지 않았다.

 

∴ Content Provider - 앱 데이터 공유 ( 데이터 관리 기능도 있으나 주로 사용되지 않는다고 한다 )

 

 

 

Broadcast Receiver

 

Broadcase Receiver는 시스템이 전반적인 사용자 플로우 밖에서 이벤트를 앱에 전달하도록 지원하는 구성요소로, 앱이 시스템 전체의 Broadcast 알림에 응답할 수 있게 합니다. 앱 전반적인 사용자 플로우 밖의 이벤트로는 배터리 충전 시작, 배터리 부족 경고 메시지, 네트워크 연결 변경 등의 시스템 알림이나, 다른 앱으로 부터 전달받는 메세지를 수신하는 것이다.

  • ❌ 최대한 Broadcast Receiver의 남용은 피해야 한다
    • Broadcast Receiver는 앱 사용 전체에 걸쳐 메모리에 존재하며 앱이 백그라운드 이동 시, 앱 종료 시 메모리에서 사라지게 되는데 앱 사용 시 힙 영역의 메모리에 지속적으로 메모리를 사용하는 것과 비동기적으로 메시지를 수신하기 때문에 과도한 Broadcast Receiver를 등록하게 되면 이벤트 핸들링 및 처리에 많은 메모리 자원이 소비될 수 있다.

∴ Broadcast Receiver - 외부 앱, 시스템 이벤트 처리

 

 

Intent 

Intent란?

  • Intent는 컴포넌트를 실행하기 위해 시스템에 전달하는 객체로 Intent 자체는 별도로 기능을 수행하지 않고, 어떤 Android 컴포넌트 중 어떤 기능을 시작할지 판별하는 데 사용하는 데이터를 전달하는 메세지 객체이다. 인텐트는 명시적 Intent와 암시적 Intent로 나눌 수 있다.

 

  • 명시적 인텐트와 암시적 인텐트로 나뉘는 이유?
    • Intent는 Android 컴포넌트에 다양하게 사용되는데, Activity를 전환하는 것과 같이 특정 Activitiy로 전환해야 하는지 명확하게 구분하여야 하는 상황에서는 Activity 이름을 명시해줌으로써 명확한 상호작용을 가능하게 한다.
    • 앱 내에서 압축파일을 해제해야 할 경우를 예를 들어보면, 사용자는 알집, 반디집 등 사용자의 상황에 따라 다르게 사용하거나, 보유하고 있는 앱의 종류가 다를 수 있다. 이때 명시적으로 알집이라는 파일 관리자 앱에 Intent를 전달하는 것이 아닌, 암시적 인텐트로 사용자가 동적으로 다른앱의 컴포넌트를 선택하여 호출할 수 있도록 해주어 유연성을 높일 수 있다.
    • 즉 명시적 Intent와 암시적 Intent로 구분하여 정확한 컴포넌트 호출, 동적인 컴포넌트 선택 및 다른 앱과의 상호작용, 유연한 앱 아키텍처 등을 위해 각각의 상황에 맞도록 인텐트를 사용하기 위함이다.

 

 

간단한 사용 예제

 

명시적 인텐트 ( Explicit Intent ) 

  • Activity 전환
val intent = Intent(this, LogInActivity::class.java)
startActivity(intent)

 

  • Service 호출
val intent = Intent(this, LocationService::class.java)
startService(intent)
    • Service를 바인딩할 경우 반드시 명시적 인텐트를 사용하여야 한다

 

 

암시적 인텐트 ( Inplicit Intent )

  • 전화걸기
    • 패키지명, 액티비티명을 별도로 지정해주지 않고 ACTION_DIAL로 기기의 DIAL 기본 앱 또는 DIAL 역할에 해당하는 앱을 선택하여 실행할 수 있다.
val intent = Intent(Intent.ACTION_DIAL, Uri.parse("tel:01012345678"))
startActivity(intent)

 

  • 지도열기
    • 전화걸기와 동일하게 지도의 위치 정보만 담아두고 동적으로 지도 앱을 선택할 수 있도록 한다.
val intent = Intent(Intent.ACTION_VIEW, Uri.parse("geo:37.587854,127.148377?q=카페"))
startActivity(intent)

 

 

 

 

 

 

 

 

 


 

[ A. 오늘 복습한 내용 / B. 다음에 학습할 내용 ]

A. Intent와 Activity

 

B. Activity와 Fragment의 차이점 자세하게 학습 해보면 좋을 것 같다.

 

C. SharedPref, VM,LiveData 등의 방식 말고 Content Provider를 통해 데이터를 관리하는 방식으로 코드 구현을 한번쯤 해보면 좋을 것 같다.


 

[오류,에러 등등]

1. Activity를 제외한 컴포넌트들을 직접 사용해볼 기회도 없었어서 정확하게 이해하기가 어려웠다. 

 

 


 

[느낀 점]

1. 😺 동기부여 받기만 하지말고 나도 동기부여 해줄 수 있도록 하기

 

 


[Reference]

 

 

// Android 4대 컴포넌트 

 

https://velog.io/@jxxn_a/%EC%B5%9C%EC%A2%85-%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8-TIL13

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

https://thinkanother.tistory.com/5

 

// Intent 

https://8iggy.tistory.com/256

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