본문 바로가기

안드로이드 자바 코틀린 기초 지식/안드로이드 기초 지식

안드로이드 4대 컴포넌트

안드로이드 4대 컴포넌트 

  • Activity
  • Service
  • Broadcast Receiver
  • Content Provider 

Activity 액티비티: 

  • 화면을 관리 사용자가 발생시키는 다양한 이벤트를 처리하는 컴포넌트
  • UI화면을 담당하는 컴포넌트
더보기

◆ 인텐트(Intent)를 통해 다른 애플리케이션의 액티비티를 호출할 수 있습니다.
◆ 2개 이상의 액티비티를 동시에 Display 할 수 없습니다. 
◆ 1개 이상의 View 또는 ViewGroup을 포함합니다.
◆ 반드시 애플리케이션에는 하나 이상의 액티비티가 있어야 합니다.
◆ 액티비티 내에 프래그먼트(Fragment)를 추가하여 화면을 분할시킬 수 있습니다

Service 서비스:

  • Service백그라운드 작업을 위한 애플리케이션 구성 요소이다
  • 음악을 재생하거나, 파일 입출력을 수행하거나, 네트워크 트랜잭션을 차리할 수 있다. 전화 앱을 켜놓지 않은 상태에서도 전화를 받을 수 있는 것은 앱을 화면에서 직접 쓰고 있지 않아도 백그라운드에서 서비스가 돌아가고 있기 때문이다.
  • 사용자가 다른 애플리케이션으로 전환하더라도 백그라운드에서 계속해서 실행된다.
  • Service 자체는 main thread에서 동작
  • 서비스에는 크게 3가지로 나뉘는데 포그라운드, 백그라운드, 바운드로 나뉜다.

3가지 서비스:  foreground, background, bound

    • 포그라운드 서비스 (Foreground services) :
      • 포그라운드 서비스는 사용자에게 잘 보이는 몇몇 작업을 수행 (오디오 앱 - 노래 재생). 
      • 어플리케이션이 종료되어도 Background에서 동작한다. 스스로 끄지 않는한 다른 앱을 사용중이어도 계속해서 실행.
      • 포그라운드 서비스는 알람 표시해야 합니다. (Notification과 같이 사용한다)
      • 사용하는 예: 오디오앱, 사용자의 달리기를 기록하는 피트니스 앱(물론 퍼미션 필요), 파일 다운로드 등등
      • 예제 1
    • 백그라운드 서비스 (Background Service) :
      • 사용자가 직접 알지 못하는 작업을 수행할 때 사용. 백그라운드 서비스는 사용자에게 직접 보이지 않는 작업을 수행.
      • 예: SNS앱. 예를 들어, SNS 앱에서 공유 버튼을 누른 후 다른 화면으로 넘어가 다른 사람의 게시물들을 본다고 할때, 다른 화면으로 넘어가거나 앱을 종료해도 게시물 업로드가 종료되지 않고 백그라운드 서비스가 시작되어 업로드는 진행중이나 사용자 입장에서는 이런 사실에 대해 눈으로 직접 보진 못하죠.
      • 바운드 서비스 (Bound Service) :
        • 앱 내에서 서비스를 사용하여 간단한 클라이언트 - 서버 환경을 구성하는 것을 말함(특정 컴포넌트와 서비스간 상호작용)
        • 이 서비스는 마치 클라이언트-서버 와 같이 동작합니다.  서비스가 서버 역할을 하는 겁니다. 
        • 이 서비스는 Activity가 클라이언트 역할을 하고, 서비스가 서버 역할을 한다.
        • 액티비티는 서비스에 어떠한 요청을 할수 있고, 서비스로부터 어떠한 결과를 받을수 있습니다.
      • 그냥 Thread 따로 쓰면 되는거 아니야? 왜 서비스로 따로 사용할까?
        • Thread의 문제점: 안드로이드 컴포넌트가 아니므로 독자적인 생명주기도 없을 뿐더러 Main Thread가 아니기 때문에 앱을 나가면 프로세스가 유지되지 않는다. 또, 만약에 OOM Killer에 의해서 프로세스가 종료되면 다시 재시작 될 것이라는 보장도 없다.
        • 하지만 Service는: 안드로이드 4대 컴포넌트 중 하나로서 독자적인 생명주기를 가지고 있고 Main Thread에서 동작하기 때문에 사용자가 앱을 나가도 프로세스가 유지된다. 만약 강제로 프로세스가 죽을 경우 다시 살아날 수도 있다.
        • 즉, 앱이 비활성화되어도 지속되어야 하는 작업은 Service로, 앱이 활성화되었을때 필요한 작업은 Thread에서 수행하는것이 바람직함

조금 더 자세한 내용

Content provider 컨텐트 프로바이더: 앱 간 데이터공유를 위한 클래스를 제공하는 컴포넌트

안드로이드 시스템에서는 각 어플리케이션마다 각각의 DB를 가질 수 있다. 그리고 어플리케이션 내부의 DB는 해당 어플리케이션만 접근이 가능하다. 다른 어플리케이션에게 DB가 전부 공개된다면 보안에 취약해 질 수 있기 때문이다. 하지만, 어플리케이션 DB 접근을 완전히 막는 것도 문제가 될 수 있다. 어플리케이션 사이에 데이터를 공유할 수 없게되기 때문이다. 

 

*안드로이드 시스템은 어플리케이션 내부 DB에 대해 해당 어플리케이션만 접근 가능한 보안성과 다른 어플리케이션에서도 DB에 접근할 수 있도록 유연함을 제공하기 위해 컨텐트 프로바이더 클래스를 제공하는 것이다.

 

  • 예를 들면 현재 앱에 휴대폰에 저장된 연락처를 받아 오는것이나 앱에서 카메라 어플을 이용해 사진을 찍고 저장해주는 것 같은 역할함.
  • 다른 앱의 데이터를 사용하고자 하는 앱에서는 URI를 이용하여 콘텐츠 리졸버(Content Resolver) 를 통해 다른 앱의 콘텐츠 프로바이더에게 데이터를 요청한다. 요청 받은 컨텐츠 프로바이더는 URI를 확인하고 내부에서 데이터를 꺼내어 컨텐츠 리졸버에게 전달한다.
  • 앱에서 데이터 공유를 제공하기 위해서는 ContentProvider 클래스를 상속받는 클래스를 먼저 생성합니다. 자동으로 onCreate(), query(), insert(), delete(), update() 함수가 만들어지는데, 이것은 데이터베이스를 생각하면 쉽게 이해를 할 수 있습니다.

Content provider (컨텐트 프로바이더) Uri란?

  • ContentProvider를 이용해야 할 ContentResolver 앱에서 ContentProvider 내부의 상세한 DB 구조를 알 수 없다. 그래서 ContentResolver측은 ContentProvider가 제공한 Uri를 가지고 DB를 간단하게 접근이 가능하도록 기능을 제공한다.

Broadcast receiver 브로드캐스트 리시버: 단말기에서 발생하는 다양한 이벤트, 정보를 받고 반응하는 컴포넌트

Broadcast Receiver는 시스템이나 앱 등에서 이벤트 발생시 방송을 해주는 개념입니다. 여기서 방송은 안드로이드에서의 메시지(알람) 를 여러 객체에 전달하는 것을 의미합니다. 

 

안드로이드 시스템에서 어떤 이벤트가 발생했을때 시스템은 "system broadcast" 라는 메세지를 보낸다. 이때 특정 이벤트가 발생한 것을 내 앱에서 알고 싶을때 Broadcast Receiver 를 통해 메세지를 받을 수 있다.

 

예를들어 배터리부족, SMS문자메시지, 전화가온다거나 하는 일들을 방송알림 해준다. 

그리고 카카오톡에서 다른사람에게 카톡을 받았을 때 이 카톡을 카카오톡 앱에 알려줘야 한다면 브로드캐스팅으로 전달하면 됨. 

  • 정적 리시버 : 매니페스트에 등록하여 리시버를 구현하는 형태인데 한 번 등록하면 해제할 수 없는 방식이다.
  • 동적 리시버 : 클래스 파일에서 리시버를 등록, 해제할 수 있는 형태이기 때문에 앱에 부하를 줄 일 수 있다. 하지만 해제를 적절히 해주지 않는다면 메모리 릭이 발생할 수 있다.
  • 너무 많은 작업, 시간이 오래걸리는 작업 X.   왜? 처리 지연시간이 길어진 경우 -> ANR이 발생하기 때문에.리시버에는
  • so 간단한 일을 처리하도록, 너무 많은 작업, 시간이 오래걸리는 작업  -> 스레드를 별도로 생성해서 처리하도록 해야한다

 

ANR 이란?? ANR 설명