본문 바로가기

Mobile/Android

[Android] 안드로이드 4대 컴포넌트

안드로이드의 4대 컴포넌트와 각 컴포넌트 중 생명주기, Life Cycle 을 갖는 컴포넌트의 생명주기 정도는 알고 사용하자.

 

안드로이드의 4대 컴포넌트(Component)

 

안드로이드 4대 컴포넌트와 인텐트를 통한 상호작용

  1.  4대 컴포넌트 정의

 

    -  안드로이드의 4대 컴포넌트는 안드로이드 앱의 필수적인 기본 구성 요소이다.

 

    -  각 구성요소는 사용자가 앱에 들어올 수 있는 진입점

 

    -  액티비티(Activity) - 서비스(Service) - Broadcast Receiver - 콘텐츠 제공자(Contents Provider) 로 이루어짐

 

  2.  4대 컴포넌트 특징

 

    1)  각 컴포넌트들은 하나의 독립적인 형태로 존재

 

    2)  각 컴포넌트들은 고유한 기능(각기 뚜렷한 목적) 수행

 

    3)  각 컴포넌트들은 인텐트를 통해 서로 상호작용

 

    4)  각 컴포넌트 별 수명 주기 존재 -> 개발자의 생성 및 소멸 방식 직접 정의 가능

 

      Ex) Activity(하위 요소인 Fragment 도 수명 주기 존재, Service

 

 

[1] 액티비티(Activity)

 

액티비티의 역할

  1.  액티비티 정의

 

    1)  사용자와 상호작용 하기 위한 진입점

 

    2)  사용자에게 보여지는, UI가 포함된 단일 화면

 

      -  여러 개의 액티비티가 모여 -> 사용자에게 하나의 앱을 제공

 

      -  모든 액티비티가 각자 서로 독립되어 있음

 

    3)  모바일 앱에서 다른 모바일 앱의 허용시 -> 그 앱이 소유한 액티비티 직접 실행 가능

 

 

  2.  액티비티 생성/관리

 

    1)  android.app.Activity 클래스 상속받아 생성

 

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }
}

 

    2)  액티비티는 화면에 표시하는 역할만 수행 -> 내용은 뷰(View) 가 갖는다.

 

    3)  Android의 Manifest.xml 파일의 <activity> 태그 = 액티비티에 대한 정보 포함

 

      -  새로운 액티비티 생성 시 Manifest.xml 파일에 새 액티비티 정보 추가 필요  

 

    4)  액티비티 매니저(Activity Manager) 객체에 의해 액티비티 스택(Activity Stack) 에서 관리됨

  

 

[1.1] 프래그먼트(Fragment)

 

  -  Fragment는 안드로이드 초기에는 없던 개념

 

 -> But 안드로이드 생태계가 넓어지고, 모바일 환경이 크게 변한며 한 화면 내에서 많은 정보를 표현 하고자 할 때

 

 -> 화면 분할 및 Activity 들끼리 분할된 컨텐츠를 재사용하기 위해 추가된 요소

 

  -  4대 컴포넌트 = 앱 프로세스의 엔트리 포인트 /

 

      Fragment는 process의 진입점이 될 수 없고, 애초에 Activity 의 하위 종속된 개념

 

  -> 단순히 lifecycle이 있는 ViewGroup 인 것

 

 

[2]  서비스(Service)

 

서비스의 역할

  1.  서비스 정의

 

    1)  특정한 목적을 위해 백그라운드에서 앱을 계속 실행하기 위한 다목적 진입점

 

    2)  백그라운드에서 실행되는 앱의 구성 요소

 

        Ex1)  오랫동안 실행되는 작업 수행 or 원격 프로세스를 위한 작업 수행

 

        Ex2)  백그라운드에서 음악을 재생하거나, 네트워크에서 파일을 다운로드 하는 작업 등 액티티에서 처리하기 어려운 작업 실행

     

          ->  실행된 상태를 계속 유지하기 위해, 서비스가 비정상적으로 종료되어도 자동으로 재실행

 

    3)  시작된 서비스는, 작업 완료 시점까지 해당 서비스를 계속 실행할 것을 시스템에 지시          

 

    4)  라이브 배경화면, 알림 리스너, 화면 보호기, 입력 메서드, 접근성 서비스 및 여러 가지 핵심 서비스 기능 = 모두 애플리케이션에서 구현

 

    ->  시스템에서 애플리케이션 실행 시 바인딩하는 서비스로 빌드

 

 

  2.  서비스 생성

 

    1)  android.app.Service 클래스를 상속받아 생성

 

    2)  서비스 생성 시 Manifest.xml 파일에 새 서비스 정보 추가

 

 

  3.  서비스 종류

 

    -  따로 정리하기! 

 

    (1)  Foreground Services

 

      -  알림을 표시해놓고 -> 사용자와 상호작용 하지 않아도, 계속해서 백그라운드에서 실행

 

    (2)  Background Services

 

      -  사용자가 직접 알지 못하는 작업 수행 시 사용

 

    (3)  Bound Services

 

      -  앱 내에서 서비스를 사용해 간단한 클라이언트(서버 환경 구성)인 특정 컴포넌트와 서비스 간의 상호 작용

 

 

[3]  브로드캐스트 리시버(Broadcast Receiver)

 

  1.  브로드캐스트 리시버 정의

 

    1)  시스템이, 정기적인 사용자 흐름 밖에서, 이벤트를 앱에 전달하도록 지원하는 구성 요소

 

      -  앱이 시스템 전체의 Broadcast 알림에 응답할 수 있도록 함

 

      -  오직 수신만! 하는 컴포넌트

 

    2)  UI에 표시 X -> 브로드캐스트 이벤트 발생 시, 상태바(status)에 알림(notification) 표시

 

    3)  브로드캐스트 리시버 = 앱으로 들어갈 수 있는 명확한 진입점

 

      -  현재 실행되지 않은 앱에도 시스템이 Broadcast 전달 가능

 

        Ex) 앱이, 사용자에게 예정된 이벤트에 대해 알리는 알림 예약 시 - 그 알림을 앱의 Broadcast Receiver 에 전달

 

        ->  앱은, 알림이 울릴 때까지 실행하고 있을 필요 X

 

        Ex) 예를 들어, Webex 가 사용자에게 특정 시간에 수업 참여에 대해 알리는 알림을 예약하려고 할 때,

 

             이 알림을 Webex 앱의 Broadcast Receiver에 전달하면

 

        ->  Webex 앱은 수업 참여 알림이 울릴 때까지, 강의실 접속 등의 실행을 하고 있을 필요가 X

 

 

  2.  브로드캐스트 발생 및 시작 시점

 

    1)  대다수의 Broadcast는 시스템에서 발생

 

        Ex) 화면이 꺼지거나, 배터리가 부족할 때, 사진 캡처 시 알리는 Broadcast

 

    2)  App 도 Broadcast 시작 가능

 

        Ex) 다른 앱에 일부 데이터가 기기에 다운로드 되었고, 이 데이터를 사용할 수 있다는 것을 알리는 용도

 

    3)  Broadcast Receiver는 다른 컴포넌트로의 게이트웨이인 경우가 보편적 & 극소량의 작업만 수행하도록

  

 

  3.  브로드캐스트 리시버 생성

 

    1)  android.content.BroadcastReceiver 클래스 상속받아 생성

 

    2)  브로드캐스트 리시버는, 단 하나의 콜백 메소드만을 가짐

 

메소드 설명
void onReceive(Context, Intent) 메시지가 리시버로 도착하면 자동으로 실행
-> 메시지를 Intent 객체와 연결된 객체로 전달

 

 

  3.  브로드캐스트 리시버 방식

 

    (1)  정적 리시버

 

      -  Manifest.xml 에 등록하여 리시버를 구현하는 형태

 

      -  한 번 등록하면 해제할 수 없는 방식

 

    (2)  동적 리시버

 

      -  클래스 파일에서 리시버 등록, 해제 가능한 형태 -> 앱의 부하를 줄일 수 있음

 

      -  해제를 적절히 해주지 않는 경우, 메모리 릭 발생 가능

 

[4]  콘텐츠 제공자(Contents Provider)

 

콘텐츠 제공자(Content Provider)

 

  1.  콘텐츠 제공자 정의

 

    1)  애플리케이션 데이터의 공유를 관리

 

      -  파일시스템, SQLite DB, 웹상이나 앱이 엑세스할 수 있는 다른 모든 영구 저장 위치에 저장 가능한 앱 데이터

 

    2)  다른 앱은, 콘텐츠 제공자를 통해 해당 데이터를 가져오거나, 콘텐츠 제공자가 허용할 경우 수정도 가능

 

        Ex) Android: 연락처 정보에 대한 콘텐츠 제공자 제공

 

        ->  권한을 가진 앱의 경우, 컨텐츠 제공자를 통해 연락처 정보를 가져와 앱에서 사용 가능

 

    3)  작은 데이터 - 인텐트(Intent)로 애플리케이션끼리 데이터 공유 가능

 

        콘텐츠 제공자 - 음악, 사진 파일 등 용량이 큰 데이터 공유에 적합

 

  2.  콘텐츠 제공자 생성

 

    1)  android.content.ContentProvider 클래스 상속받아 생성

 

    2)  데이터의 Read(읽기), Write(쓰기)에 대한 Permission 필요 -> 애플리케이션에 접근이 가능

 

 

 

인텐트(Intent)

 

  1.  인텐트의 정의

 

    1)  애플리케이션 컴포넌트 간에 작업 수행을 위한 정보 전달 역할 = 통신 수단

 

       -  서로 독립적으로 동작하는 4가지 컴포넌트 간의 상호 통신을 위한 장치

 

    2)  컴포넌트에 액션(Action), 데이터(Data) 등 전달

 

    3)  인텐트를 통해 다른 애플리케이션의 컴포넌트 활성화 가능

 

        Ex) 액티비티 간의 화면 전환(이동)

 

        -  인텐트 = 컴포넌트 A가 컴포넌트 B 호출 시 필요한 정보 보유  

 

        -> 이 정보에, 호출 대상이 되는 컴포넌트 B 의 이름 명시적 표시, 속성(Attribute) 암시적 표시  

 

        -> 호출된 컴포넌트 B가 -> 호출한 컴포넌트 A로 어떤 결과 전달 시 사용

 

 

참고

 

  -  https://50billion-dollars.tistory.com/entry/Android-%EB%B8%8C%EB%A1%9C%EB%93%9C%EC%BA%90%EC%8A%A4%ED%8A%B8-%EB%A6%AC%EC%8B%9C%EB%B2%84-Broadcast-Receiver

 

  -  https://velog.io/@jojo_devstory/%EC%95%88%EB%93%9C%EB%A1%9C%EC%9D%B4%EB%93%9C-Android-4%EB%8C%80-%EC%BB%B4%ED%8F%AC%EB%84%8C%ED%8A%B8

 

  -  https://ybdeveloper.tistory.com/39

 

  -  https://4z7l.github.io/2020/07/08/android-4-component.html