본문 바로가기

Study/Programming

안드로이드 서비스 - 꼬로미

오케이3


안녕하세요 꼬로미입니다


안드로이드 프로그래밍 서비스에 대한 포스팅입니다




서비스(Service)

                                                                                                  



사용자 인터페이스 없이 백그라운드에서 실행되는 동작이 필요한 경우 사용되는 것이 서비스로

주기적으로 데이터를 읽을때, 주기적으로 폰 사용량을 계산시 등에 사용됩니다

  • 한번 시작된 서비스는 사용자가 다른 애플리케이션으로 이동하더라고 계속하여 백그라운드에서 실행됨

  • 프로세스간 통신(IPC; interprocess communication) 기능도 구현 가능

  • 네트워크 트랜잭션이나 음악 재생, 파일 입출력, 콘텐트 제공자와의 통신을 위해 주로 사용


서비스의 종류

서비스 시작후 무한정하게 실행 (unbounded)

서비스를 시작한 액티비티가 실행되고 있는 동안만 실행 (bounded)
서비스도 액티비티와 마찬가지로 인텐트 객체를 이용해 시작

매니페스트 파일안에 공용으로 선언되어야 사용이 가능

서비스는 서비스를 호출한 프로세스의 메인 스레드 안에서 실행


  • 시작 타입의 서비스(started service)
    액티비티가 startService()를 호출해 서비스를 시작한 타입의 서비스

  • 연결 타입의 서비스(bound service)
    액티비티가 bindService()를 호출하여서 서비스를 시작하면 연결 타입이 서비스가 됨
    서버-클라이언트와 같이 동작
    연결 타입 서비스는 액티비티와 연결되어 있는 동안에만 실행
    서비스에 다수의 액티비티가 연결될 수 있음





서비스 기초

                                                                                                  



서비스는 Service라는 클래스를 상속받아 작성해야하며 매니페스트 파일에 선언해주어야 합니다


음악을 백그라운드에서 서비스시

1. 소스파일 작성

public class MusicService extends Service

onBind(){ ... }

onCreate() {... }

onDestroy() {...}

onStartCommand() {...}


onBind() : 다른 컴포넌트가 bindService()를 호출해 서비스와 연결시도시 호출

onCreate() : 서비스가 처음으로 생성되면 호출

onDestroy() : 서비스가 소멸되는 도중 호출, 생애주기에서 마지막 호출

onStartCommand() : 다른 컴포넌트가 startService()를 호출하여 서비스가 시작되면 호출    

                                 작업이 완료시 stopSelf()나 stopService()를 호출해 종료해야함 (미종료시 무한정 실행)


2. 음악 파일을 /res/raw 디렉토리에 저장


3. 매니페스트 파일 수정

매니페스트 파일에 서비스가 선언되어야 다른 컴포넌트들이 사용가능

<application> 엘리먼트의 자식으로 <service> 엘리멘트를 추가

 <service

android:enabled="true"

android:name=".MusicService"

/>



서비스의 생애주기

startService()를 호출해 서비스를 시작하여

stopSelf()나 stopService()가 호출될 때까지 실행을 계속하게됩니다


            시작타입의 서비스(왼쪽)과 연결타입의 서비스(오른쪽)






IntentService 클래스

                                                                                                  



시작타입의 서비스 생성을 위해 작성할 수 있는 클래스 2가지

  • Service 클래스
    모든 서비스의 부모 클래스
    메인 스레드를 사용해 큰 작업시 애플리케이션 실행속도에 영향을 줄 수 있음

  • IntentService 클래스
    시작 요청이 들어올 때마다 처리하는 작업 스레드를 별도로 생성하는 클래스
    콜백 메소드에 대해 디폴트 구현을 제공
    요청 처리시 자동적으로 서비스를 중단
    개발자는 onHandleIntent()를 구현해야함





연결 타입의 서비스(bound service)

                                                                                                  



클라이언트-서버 모델에서 서버의 역할을 수행할 수 있는 서비스
프로세스 간 통신(interprocess communication)이 가능하며
시작 타입 서비스와는 달리 백그라운드에서 무한정 실행되지 않음

여러 클라이언트들이 하나의 서비스에 동시 접속이 가능

bindService()를 호출해 서비스에 연결하는 서비스


서비스의 인터페이스를 정의하는 방법 3가지

  • Binder 클래스 확장
    서비스가 애플리케이션 내에서만 사용될때 서비스의 인터페이스를 Binder 클래스를 확장하여 정의하고
    onBind()가 호출되었을 때 그 클래스 인스턴스를 반환 가능
    주로 서비스가 애플리케이션 내에서 백그라운드 작업을 담당하는 경우 사용됨

  • Messenger 클래스 사용
    다른 프로세스들이 서비스를 사용할때 Messenger를 사용해 인터페이스를 생성 가능
    Handler를 정의해 서비스는 다양한 종류의 Message 객체에 응답
    프로세스간 통신을 구현하는 간단한 방법

  • Using AIDL(Android Interface Definition Language)
    객체를 운영체제가 이해할 수 있는 기초 단위로 분해하고 IPC를 수행하도록 이들을 프로세스 사이에서 주고받는 모든 작업을 수행



신나2

읽어주셔서 감사드리며

뷰업 한번 클릭부탁드립니다^^*