#16 [Kotlin] 컴포넌트

정상준·2022년 10월 29일
0

kotlin

목록 보기
16/26
post-thumbnail
post-custom-banner

📝브로드캐스트 리시버

브로드캐스트 리시버는 흔히 이벤트 모델로 실행되는 컴포넌트라고 정의한다. 여기서 이벤트란 액티비티를 다룰 때 살펴본 사용자 이벤트가 아니라 부팅이 완료되는 것과 같은 시스템의 특정한 상황을 의미한다. 시스템에 어떤 이벤트가 발생하면 브로드캐스트 리시버를 실행해 앱이 해당 상황에 맞게 동작하도록 할 수 있다.

브로드캐스트 리시버를 만들려면 BroadcastReceiver를 상속받는 클래스를 선언해야 한다. 브로드캐스트 리시버의 생명주기 함수는 onReceive() 하나로 어디선가 이 리시버를 실행하려고 인텐트를 시작하면 onReceive() 함수가 자동으로 호출된다.

class MyReceiver : BroadcastReceiver(){
    override fun onReceive(context: Context, intent: Intent){
    }
}

📝서비스

서비스는 오래 걸리는 작업을 백그라운드에서 처리할 수 있게 해주는 컴포넌트이다. 따라서 서비스에 화면을 구현하지 않으며 안드로이드의 컴포넌트이므로 생명주기를 시스템에서 관리한다.

서비스 컴포넌트는 Service 클래스를 상속받아서 작성한다. 서비스에는 다양한 생명주기 함수를 재정의할 수 있지만 onBind()는 필수이다.

class MyService : Service(){
    override fun onBind(intent: Intent): IBinder? {
      return null
     }
}

서비스를 실행하려면 시스템에 인텐트를 전달해야 하는데 이때 사용하는 함수는 startService()와 bindService() 2가지이다.

startService()는 다른 컴포넌트와 상호작용을 하지 않을 때 사용하며 bindService()는 다른 컴포넌트와 데이터를 주고받을 일이 있을 때 실행합니다.

📝AIDL 통신 기법

AIDL은 두 프로세스 사이에 데이터를 주고받는 프로세스 간 통신을 구현할 때 사용하는 기법으로, 서비스 컴포넌트의 bindService() 함수를 이용한다. 안드로이드는 두 프로세스가 데이터를 주고받을 때 하나의 프로세스가 시스템에 데이터를 전달한 후 시스템이 다른 프로세스에 전달해 준다. 그런데 시스템에 전달하는 데이터는 시스템이 해석할 수 있는 원시 타입으로 변환해야 하고 전송하는 데 적합한 형식으로 변환하는 마샬링과정을 거쳐야 한다. 그런데 AIDL을 이용하면 이러한 작업을 대신 처리해 주므로 편리하다.

📝콘텐츠 프로바이더

콘텐츠 프로바이더는 앱끼리 데이터를 연동하는 컴포넌트이다. 이때 데이터는 대상 앱의 데이터베이스나 파일 또는 앱에 할당된 메모리에 있다. 콘텐츠 프로바이더를 이용하면 이런 저장소에 있는 데이터를 가져오거나 수정할 수 있다. 앱의 데이터는 그 앱의 구성 요소에서 이용할 때는 문제가 없지만 외부 앱에서는 기본적으로 접근하지 못한다. 외부 앱에서 마음대로 접근하면 보안 문제가 발생하기 때문이다. 그렇지만 앱을 만들다 보면 공유해야 하는 데이터도 있다. 이처럼 어떤 앱의 데이터를 다른 앱에서 이용할 수 있게 하려면 콘텐츠 프로바이더를 이용해야 한다.

profile
안드로이드개발자
post-custom-banner

0개의 댓글