안드로이드/Android

안드로이드 4대 컴포넌트(구성요소)

block_626 2022. 5. 8. 18:11

안드로이드 앱을 개발하기 위해서는 안드로이드를 구성하는 요소에 대해서 알아야 합니다.

여러가지 구성요소가 있지만 이중에서도 가장 중요한 안드로이드 4대 구성요소가 있습니다.

 

- Activity(액티비티)

- Service(서비스)

- Broadcast Recevier(방송 수신자)

- Content Provider(콘텐츠 제공자)

어플리케이션을 만들때 주요 구성요소이자 안드로이드의 사실상의 모든 구 성요소입니다. 각각의 구성요소는 인텐트를 통해서 상호 통신을 합니다. 즉 액티비티에서 다른 구성요소를 호출할때는 인텐트를 거쳐야 한다는 것입니다.

 

- 각 컴포넌트들은 하나의 독립적인 형태로 존재함.
- 각 컴포넌트들은 고유의 기능을 수행함.
- 각 컴포넌트들은 인텐트를 통해 서로 상호작용함.


1. 액티비티(Activity)

 

 

액티비티는 사용자에게 UI가 있는 화면을 제공하기 위한, 화면 단위를 구성하는 컴포넌트입니다.

하나의 앱에 반드시 하나 이상의 액티비티가 존재해야합니다.

Activity 클래스를 상속받아 사용하며, 액티비티를 새로 만들어 사용할 경우에는 manifest 파일에 선언해야합니다.

가장 처음 안드로이드 스튜디오에서 어플리케이션을 생성하면 만들어지는 MainActivity 또한 하나의 액티비티이며, 이는 사용자가 앱을 처음에 실행하였을 때에 보여지는 메인 액티비티라고 할 수 있습니다.

액티비티가 기본적으로 가지고 있는 생명주기 메소드를 재정의하여 원하는 기능을 구현하는 방식으로 제작합니다.

가장 많이 쓰이는 컴포넌트 이기때문에 굉장히 중요하다고 볼 수 있습니다.

(생명주기에 대한 내용은 https://06block26.tistory.com/23에서 정리)

 

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

 

2. 서비스(Service)

서비스는 사용자와 직접적으로 상호작용하는 요소가 아닌 흔히 백그라운드(Background)에서 어떠한 작업을 처리하기 위해 서비스를 사용하는데, PC로 예를 들면 백그라운드에서 동작하는 서비스 프로그램과 동일하며 안드로이드 모바일에서는 애플리케이션을 사용하면서 유튜브 또는 멜론등 음원 스트리밍 앱을 사용한다던지 다른 작업을 하면서 파일을 다운로드할 때 서비스를 주로 사용합니다.

서비스는 화면이 존재하지 않습니다.

하지만 서비스도 애플리케이션의 구성요소이므로 새로 만든 후에는 항상 매니페스트에 등록을 해주어야 합니다.

메인 액티비티에서 서비스를 시작하고 싶은 경우에는 startService()라는 메서드를 이용해 서비스를 실행시킬 수 있습니다.

서비스 같은 경우 사용자의 인터페이스(UI, 화면)를 방해하지 않고 눈에 보이지 않는 곳에서 작업을 처리하기 때문에 별도의 스레드(Thread)에서 동작한다고 오해하는 경우가 많습니다.
하지만.... 서비스는 엄연히 메인 스레드에서 동작하기 때문에 서비스 내에서 별도의 스레드를 생성하여 작업을 처리해야 합니다.

  1. 화면이 없습니다. 그저 백그라운드에서 돌아가는 컴포넌트입니다.
  2. 네트워크(Network)와 연동이 가능하고 네트워크를 통해서 데이터를 가져올 수 있습니다.
  3. 별도의 UI를 가지지 않으며 백그라운드에서 수행됩니다.
  4. 애플리케이션이 종료되어도 이미 시작이 된 서비스(Service)는 백그라운드(Background)에서 계속 동작합니다.
  5. 모든 서비스는 Service클래스를 상속받아서 사용합니다.
  6. 액티비티와 서비스는 UI스레드라고 불리는 동일한 애플리케이션 스레드로 실행됩니다.

3. 방송 수신자 (BroadCast Receiver)

방송 수신자(BroadCase Receiver)는 안드로이드 OS로부터 발생하는 각종 이벤트와 정보를 받아와 핸들링하는 컴포넌트입니다.
사용자 안드로이드 디바이스의 시스템 부팅시 앱 초기화, 네트워크 끊김 등등 특수한 이벤트에 대한 처리나 배터리 부족 알림 ,문자 수신과 같은 정보를 받아 처리를 해야 할 필요가 있을 때 동작합니다.
즉, 안드로이드 OS에서 메신저앱 또는 문자 메시지가 오면 모든 앱에 "메시지가 왔다"라는 하나의 정보를 방송(BroadCast)을 합니다.
이 메시지를 받기 위해 브로드캐스트 리시버를 구현하면 되며 해당 정보가 오면 특정 이벤트를 처리할 수가 있습니다.

 

  1. 디바이스에서 발생하는 일 중에서 어플리케이션이 알아야 하는 상황이 발생하면 알려줍니다.
  2. 거의 대부분 UI를 가지지 않습니다.
  3. 안드로이드 디바이스의 특수한 상황에 대응하기 위해 사용됩니다.
  4. 수신기를 통해 디바이스의 상황을 감지하고 적절한 작업을 수행합니다.
  5. 특정한 상황을 제외하고는 브로드캐스트는 시스템에서 시작합니다.

2. 코드

2-1. 정적 브로드캐스트

// manifests
<receiver
    android:name=".MyReceiver"
    android:enabled="true"
    android:exported="false">
    <intent-filter>
          <action android:name="android.intent.action.BOOT_COMPLETED"/>
          <action android:name="android.intent.action.INPUT_METHOD_CHANGED" />
    </intent-filter>
</receiver>

//receiver
class MyReceiver : BroadcastReceiver() {

    override fun onReceive(context: Context, intent: Intent) {
        // This method is called when the BroadcastReceiver is receiving an Intent broadcast.
        TODO("MyReceiver.onReceive() is not implemented")
    }
}

//부팅될때, 입력수단이 바뀔때 리시버작동

2-2. 동적 브로드캐스트

class MainActivity : AppCompatActivity() {

    private val myReceiver = MyReceiver()

    override fun onResume() {
        super.onResume()

        1,2
        val filter = IntentFilter("action")
        registerReceiver(myReceiver, filter)

        3.
        LocalBroadcastManager.getInstance(this).registerReceiver(myReceiver, filter)
    }

    override fun onPause() {
        super.onPause()

        1,2
        unregisterReceiver(myReceiver)
   
        3.
        LocalBroadcastManager.getInstance(this).unregisterReceiver(myReceiver)
    }
}

//receiver
class MyReceiver : BroadcastReceiver() {

    override fun onReceive(context: Context, intent: Intent) {
        // This method is called when the BroadcastReceiver is receiving an Intent broadcast.
        TODO("MyReceiver.onReceive() is not implemented")
    }
}


//전송
Intent().also {
      it.action = "action"

      1.
      sendOrderedBroadcast(it, "String")

      2.
      sendBroadcast(it)

      3.
      LocalBroadcastManager.getInstance(this).sendBroadcast(it)
}

 

브로드캐스트 전송방법

1. sendOrderedBroadcast(Intent, String) 메서드는 한 번에 하나의 수신자에 브로드캐스트를 전송합니다. 각 수신자는 차례로 실행되기 때문에 결과를 다음 수신자로 전파하거나 브로드캐스트를 완전히 중단하여 브로드캐스트가 다른 수신자로 전달되지 않도록 할 수 있습니다. 수신자가 실행되는 순서는 일치하는 인텐트-필터의 android:priority 속성으로 제어할 수 있습니다. 우선순위가 동일한 수신자는 임의의 순서로 실행됩니다.

 

2. sendBroadcast(Intent) 메서드는 정의되지 않은 순서로 모든 수신자에 브로드캐스트를 전송합니다. 이를 일반 브로드캐스트라고 합니다. 일반 브로드캐스트는 상당히 효율적이지만 수신자가 다른 수신자의 결과를 읽거나 브로드캐스트로부터 수신한 데이터를 전파하거나 브로드캐스트를 중단할 수 없음을 의미합니다.

 

3. LocalBroadcastManager.sendBroadcast 메서드는 발신자와 동일한 앱에 있는 수신자에 브로드캐스트를 전송합니다. 앱 간에 브로드캐스트를 전송할 필요가 없다면 로컬 브로드캐스트를 사용합니다. 구현이 훨씬 더 효율적이며(프로세스 간 통신이 필요 없음) 다른 앱이 브로드캐스트를 수신하거나 전송할 수 있는 측면과 관련된 보안 문제에 관해 걱정할 필요가 없습니다.

4.콘텐트 제공자 (Content Provider)

콘텐트 제공자(Content Provider)는 데이터를 관리하고 다른 애플리케이션의 데이터를 제공하는 데 사용되는 컴포넌트입니다.
특정한 애플리케이션이 사용하고 있는 데이터베이스(DB)를 공유하기 위해 사용하며 애플리케이션 간의 데이터 공유를 위해 표준화된 인터페이스를 제공합니다.

  1. 콘텐츠 제공자는 파일 시스템, SQLite DB, 웹상이나 앱이 엑세스할 수 있는 다른 모든 영구 저장 위치에 저장 가능한 앱 데이터의 공유형 집합을 관리합니다.
  2. 다른 앱은 콘텐츠 제공자를 통해 해당 데이터를 가져오거나, 콘텐츠 제공자가 허용할 경우 수정도 가능합니다.
  3. 예를 들어 Android는 연락처 정보에 대한 콘텐츠 제공자를 제공하는데, 권한을 가진 앱이라면 컨텐츠 제공자를 통해 인물들의 연락처 정보를 가져와 앱들을 위해 사용할 수 있습니다.
  4. 외부 애플리케이션이 현재 실행 중인 애플리케이션 내에 있는 데이터베이스(DB)에 함부로 접근하지 못하게 할 수 있으면서 나 자신이 공개하고 공유하고 싶은 데이터만 공유할 수 있도록 도와줍니다.
  5. 작은 데이터들은 인텐트(Intent)로 애플리케이션끼리 데이터를 서로 공유가 가능하지만 콘텐 프로바이더는 음악 또는 사진 파일 등과 같이 용량이 큰 데이터들을 공유하는데 적합합니다.
  6. 프로바이더는 데이터의 Read(읽기), Write(쓰기)에 대한 퍼미션이 있어야 애플리케이션에 접근이 가능합니다.
  7. 데이터베이스에서 흔히 사용되는 CURD(Create, Read, Update, Delete) 원칙을 준수합니다.

'안드로이드 > Android' 카테고리의 다른 글

[Android] 안드로이드 HTTP 통신  (0) 2022.07.29
RecyclerView  (0) 2022.05.31
안드로이드 엑티비티 생명주기(Activity Life Cycle)  (0) 2022.05.08