앱 구성요소

kosdjs·2025년 5월 31일
0

Android

목록 보기
2/24
  • Android 앱의 필수 빌딩 블록

  • 각 구성요소(Component)는 시스템이나 사용자가 앱에 진입할 수 있는 진입점(Entry Point)

  • 일부 구성요소는 다른 구성요소에 의존하기도 함

  • 각각의 생명주기와 목적이 있음

Activity

  • 사용자 인터페이스가 있는 단일 화면을 나타내는 구성요소

  • 앱이 허용한다면 다른 앱에서 액티비티 시작도 가능

  • 액티비티는 다음과 같이 시스템과 앱의 주요 상호작용을 도움

    • 사용자가 현재 관심을 가지는 것(즉, 화면에 표시되는 것)을 추적하여 시스템이 해당 액티비티를 호스팅하는 프로세스를 계속 실행하도록 함
    • 사용자가 다시 돌아올 수 있는 중지된 액티비티를 포함하는 이전에 사용한 프로세스를 파악하여, 해당 프로세스의 우선순위를 높여 계속 사용할 수 있도록 함
    • 프로세스가 종료된 경우, 사용자가 이전 상태로 복원된 액티비티로 돌아올 수 있도록 앱이 이를 처리하도록 도움
    • 앱이 서로 간에 사용자 흐름을 구현할 수 있도록 하며, 시스템이 이러한 흐름을 조정할 수 있도록 함, 공유 기능이 대표적인 예

Service

  • 앱을 백그라운드에서 계속 실행하기 위한 범용 진입점

  • 백그라운드에서 오래 걸리는 작업을 하거나, 원격 프로세스를 위한 작업을 하는 프로세스

  • 사용자 인터페이스를 가지지 않음

시작된 서비스(Started Service)

  • 작업이 완료될 때까지 계속 실행되도록 시스템에 알림

  • 백그라운드에서 데이터를 동기화하거나, 사용자가 음악 앱을 떠나도 음악을 재생하는 작업에 해당

    • 음악 재생은 사용자가 직접 인지하는 작업이므로 종료되면 사용자에게 안좋은 경험이므로 앱은 시스템에 포그라운드 상태임을 알리고, 알림을 통해 사용자에게 실행 중이라는 것을 알려야 함. 이런 경우에 시스템은 해당 서비스를 계속 실행되는 것을 우선시함.
    • 일반적인 백그라운드 작업은 사용자가 직접 인지하지 않으므로, 시스템이 프로세스를 관리하는데 더 많은 자유를 가짐. 이런 경우에 사용자에게 더 중요한 작업을 하기 위해 자원이 필요하면 시스템이 서비스를 중단시키고 나중에 다시 시작할 수 있음.

바인딩된 서비스(Bound Service)

  • 다른 앱(또는 시스템)이 서비스를 사용하겠다고 요청할 때 실행됨

  • 다른 프로세스에게 API를 제공하며, 시스템은 이들 프로세스 사이에 의존성이 있는 것을 인지함

Broadcast Reciever

  • 정규 사용자 플로우 외부에서 발생한 이벤트를 앱에 전달하는 컴포넌트

  • 대부분은 시스템에서 발생하는 이벤트를 불러옴

    • 화면이 꺼졌음, 배터리가 부족함, 사진이 촬영되었음 등이 해당함
  • 앱에서 브로드캐스트를 직접 발생시킬수도 있음

    • 데이터 다운로드가 완료되어 다른 앱을 사용가능하다고 알릴 때
  • 사용자 인터페이스를 제공하지 않지만, 알림을 생성해 사용자가 이벤트를 인지할 수 있게 함

  • 일반적으로 다른 컴포넌트로의 게이트웨이 역할을 하며, 최소한의 작업 수행하도록 설계됨

  • 앱 간 상호작용이 많기 때문에 보안에 신경써야 함

Content Provider

  • 파일 시스템, SQLite 데이터베이스, 웹, 또는 앱이 접근할 수 있는 기타 영구 저장소에 저장된 앱 데이터를 관리하는 컴포넌트

  • 이 컴포넌트를 통해 허용한다면 다른 앱이 데이터 쿼리를 하거나, 데이터를 수정할 수도 있음

  • URI 스킴으로 구분되는 이름이 지정된 데이터를 게시하는 진입점

  • 앱이 어떻게 URI 네임스페이스에 데이터를 매핑할지 정할 수 있고, 그 URI를 다른 엔티티에 전달함으로 데이터를 접근할 수 있도록 함

  • 컨텐츠 제공자를 통해 시스템이 앱을 관리하는 몇 가지 특별한 작업

    • URI를 할당하는 것은 앱이 계속 실행되고 있을 필요가 없으므로, 앱이 종료되어도 URI는 지속됨. 따라서 URI에서 데이터를 가져올때만 앱이 실행되어 있으면 됨
    • URI를 사용하면 앱 간에 데이터 공유 시, 임시 권한을 통해 특정 데이터만 제한적으로 접근할 수 있도록 세밀한 보안 제어가 가능함

안드로이드 시스템의 특이점

  • 안드로이드는 다른 시스템과 다르게 main() 함수와 같은 단일 진입접이 아님

  • 앱에서 다른 앱의 구성요소를 직접 접근할 수는 없지만, 안드로이드 시스템은 가능함

  • 시스템에 특정 구성요소가 필요하다는 인텐트(Intent)를 전달하면 시스템이 구성요소를 활성화 해줌

구성요소 활성화

  • 인텐트(Intent)라는 비동기 메시지를 통해 액티비티, 서비스, 브로드캐스트 리시버를 활성화할 수 있음

  • 인텐트는 다른 구성요소에게 동작을 요구하는 메신저 역할을 함으로서 런타임시 개별 구성요소를 서로 연결해줌

  • 인텐트는 Intent 객체로 생성되며, 특정 구성요소(명시적 인텐트) 또는 특정 유형의 구성요소(암시적 인텐트)를 활성화할지 메시지를 정의함

  • 액티비티와 서비스의 경우, 인텐트는 수행할 작업(예: 보기, 전송)을 정의하고, 작업할 데이터의 URI 등 구성요소가 알아야 할 기타 정보를 지정할 수 있음

  • 브로드캐스트 리시버의 경우, 인텐트는 브로드캐스트 알림을 정의함, 예시로 배터리 부족 브로드캐스트는 배터리 부족을 알려주는 액션 스트링만을 함유하고 있음

    액션 스트링(Action String) : android.intent.action.AIRPLANE_MODE 와 같이 안드로이드에서 일어날 수 있는 이벤트를 상수로 지정해 놓은 것

  • 컨텐츠 제공자는 다른 구성요소와 다르게 Content Resolver의 요청에 지정될 때 활성화 됨

  • Content Resolver는 콘텐츠 제공자와의 모든 직접적인 트랜잭션을 처리하며, 컨텐츠 제공자와 트랜잭션을 수행하는 구성요소는 Content Resolver 객체의 메소드를 호출해야 함. 이는 보안상의 이유로 컨텐츠 제공자와 정보를 요청하는 구성요소 사이에 추상화 계층을 둠

구성요소별 활성화 메소드

  • 액티비티를 시작하려면 인텐트를 startActivity() 메소드로 전달하면 됨, 결과를 받고 싶으면 startActivityForResult() 메소드 사용

  • Android 5.0(API 레벨 21) 이상에서는 JobScheduler 클래스를 사용해 작업을 예약할 수 있습니다. 이전 버전에서는 Intent를 startService()에 전달하여 서비스를 시작하거나, bindService()에 전달하여 서비스에 바인딩할 수 있습니다.

  • 브로드캐스트 리시버를 활성화하려면 Intent를 sendBroadcast() 또는 sendOrderedBroadcast() 등의 메서드에 전달해 브로드캐스트를 보낼 수 있음

  • 콘텐츠 제공자에 쿼리를 수행하려면, ContentResolver의 query() 메서드를 호출

원문
https://developer.android.com/guide/components/fundamentals

0개의 댓글