서비스의 종류
시작 타입의 서비스(started service)
액티비티가 startService()를 호출하여서 서비스를 시작
연결 타입의 서비스(bound service)
액티비티가 bindService()를 호출하여서 서비스를 시작
서비스를 사용해야 할지 스레드를 사용해야 할지 결정해야 한다면 다음을 참고해서 결정하면 된다.
서비스는 사용자가 애플리케이션과 상호작용하고 있지 않더라도 백그라운드에서 실행되는 컴포넌트이다. 따라서 백그라운드에서도 작동하게 하는 것을 원하는 것이라면 서비스를 사용하면 된다. 반대로 사용자가 애플리케이션과 상호작용하고 있는 동안에만 메인 스레드 외부에서 작업을 하는 것이 필요하면 새로운 스레드를 생성하는 것이 바람직하다.
서비스의 생애주기
서비스의 생애주기는 시작 타입의 서비스인지 연결 타입의 서비스인지에 따라 조금 다르다.
시작 타입의 서비스인 경우 컴포넌트가 startService()를 호출하면, onCreate -> onStartCommand() 순으로 호출되고 서비스가 실행된다. 그리고 서비스가 정지되면 onDestroy()가 호출된 후 서비스가 종료된다. 시작 타입 서비스의 Active Lifetime 은 onStartCommand() 부터 onDestroy()가 호출되기 전까지이다.
연결 타입의 서비스는 컴포넌트가 bindService()를 호출하면, OnCreate() -> onBind() 순으로 호출되고 서비스가 실행(클라이언트가 연결)된다. 그 후에 클라이언트가 연결을 해제하면 onUnbind()가 호출된 후 onDestroy()가 호출되면서 서비스가 종료된다. 연결 타입 서비스의 Active Lifetime은 onBind() ~ onUnbind() 까지이다.
시작 타입의 서비스를 생성하기 위해서는 일반적으로 다음과 같은 두 가지의 클래스를 상속받을 수 있다.
- Serivce 클래스 : 이 클래스는 모든 서비스의 부모클래스이다. 이 클래스를 상속받아 서비스를 작성할 때는 주의할 점이 있는데, 만약 서비스에서 하는 작업이 상당히 시간을 많이 요구하는 작업이라면 서비스 안에서 새로운 스레드를 생성하는 것이 좋다. 그렇지 않으면 서비스가 메인 스레드를 사용하게 되어 애플리케이션이 실행되는 속도를 더디게 할 수 있기 때문이다.
- IntentService 클래스 : 이 클래스는 시작 요청이 들어올 때마다 이것을 처리하는 작업 스레드를 별도로 생성한다. 이 클래스는 서비스가 다중 요청을 동시에 처리할 필요가 없다면 가장 좋은 선택이 된다. IntentService 클래스에서는 콜백 메소드에 대하여 디폴트 구현을 제공하므로 개발자가 별도로 콜백 메소드를 구현할 필요가 없다는 장점이 있다. 또한 요청이 처리되면 자동적으로 서비스를 중단한다.
연결 타입의 서비스
연결 타입 서비스는 클라이언트-서버에서 서버의 역할을 할 수 있다. 컴포넌트들은 서비스에 연결해서 요청을 보내고, 서비스는 요청에 대한 결과를 컴포넌트로 전송한다.
연결 타입 서비스를 이용하면 프로세스 간 통신도 가능하다. 연결 타입 서비스는 컴포넌트와 연결되어 있는 동안에만 존재하기 때문에 시작 타입 서비스와는 다르게 백그라운드에서 무한히 실행되지 않는다. 연결 타입 서비스는 애플리케이션 안의 기능을 외부에 제공하는 경우에 많이 사용한다.
서비스 인터페이스를 정의하는 3가지의 방법
- Binder 클래스 확장하기
만약 서비스가 애플리케이션 내에서만 사용된다면 서비스의 인터페이스를 Binder 클래스를 확장하여서 정의하고 onBind()가 호출되었을 때, 그 클래스의 인스턴스를 반환할 수 있다. 이 방법은 주로 서비스가 애플리케이션 내에서 백그라운드 작업을 담당하는 경우에 선호된다. - Messenger 클래스 사용하기
다른 프로세스들이 서비스를 사용한다면 Messenger를 사용하여서 인터페이스를 생성할 수 있다. 이 Handler가 Message의 기초가 된다. 이 방법은 프로세스 간 통신을 구현하는 가장 간단한 방법이다. - Using AIDL
AIDL(Android Interface Definition Language)은 객체를 운영체제가 이해할 수 있는 기초 단위로 분해하고 IPC를 수행하도록 이들을 프로세스 사이에서 주고받는 모든 작업을 한다. 앞의 Messenger도 사실 AIDL에 기반을 두고 있다. AIDL을 직접 사용하려면 인터페이스를 정의하는 .aidl 파일을 생성해야 한다. 안드로이드 SDK 도구가 이 파일을 이용해서 추상 클래스를 생성한다.
'Android' 카테고리의 다른 글
[Android] XML처리와 안드로이드 멀티미디어 (0) | 2021.12.04 |
---|---|
[Android] 스레드 (0) | 2021.10.13 |
[Android] 안드로이드 방송 수신자(Broadcast Receiver) (0) | 2021.10.07 |
안드로이드 스튜디오 자동완성 대소문자 구분 없애기 (0) | 2021.10.07 |
안드로이드 스튜디오 보라색 배경 해결법 (0) | 2021.10.07 |