<안드로이드/Android> 서비스(SERVICE) PART1

Posted by 앱해피
2015. 6. 17. 02:51 안드로이드 이론
안드로이드 서비스(Android Service)란 무엇일까?

출처 : 안드로이드 개발자 홈페이지

 

 

Services

 

안드로이드 서비스(Service)는 백그라운드에서 오래 걸리는 작업을 처리하는 애플리케이션 컴포넌트이며, 유저 인터페이스를 갖지 않는다.

다른 컴포넌트(액티비티, 브로드캐스트 리시버)는 서비스를 시작 시킬 수 있다. 심지어 유저가 다른 애플리케이션을 사용해도 서비스는 계속 동작한다.

 

안드로이드 컴포넌트는 서비스와 상호 동작을 하기 위해 연결(Bind) 될 수 있다. 또한 컴포넌트와 서비스가 다른 프로세스에서 동작하더라도 IPC를 통해서 상호 연결이 가능하다.

 

예를 들어, 서비스에서 네트워크 관련 기능을 처리한다던지, 음악을 재생한다던지, 파일 입출력을 한다던지, 내용 제공자와 상호 동작할 수 있다.

 

 

안드로이드 서비스 2가지 알아보기

 

서비스는 2가지 형태를 갖는다.

 

[Started] : 다른 컴포넌트가 startService()라는 함수를 호출해서 서비스를 시작시킬 수 있다.

 

이때 서비스가 [Started]에 해당한다. [Started] 서비스가 일단 시작되면, 서비스를 작동시킨 컴포넌트가 종료한 상태라도 백그라운드에서 계속 작동한다.

 

보통, [Started] 서비스는 단일 기능만을 담당하여 처리하고, 서비스를 실행시킨 호출자에게 어떠한 데이터도 반환해주지 않는다.

 

예를 들어, 어느 [Started] 서비스가 네트워크를 통해 데이터를 다운 받거나 업로드 할 때, 그와 관련된 작업이 완료되면 서비스는 스스로 종료된다.

 

[Bound] : 다른 컴포넌트가 bindService()라는 함수를 호출해서 서비스와 결속("bound") 될 수 있다.

 

[Bound] 서비스는 여러 컴포넌트에서 서비스와 상호 동작하는 것, 요청을 보내는 것 그리고 결과 데이터를 받는 것을 지원하기 위해서 클라이언트-서버 인터페이스를 제공한다.

 

[Bound]서비스는 해당 서비스와 결속(bound) 돼 있는 컴포넌트가 하나라도 존재하는 한 계속 유지된다.

 

여러 컴포넌트가 하나의 서비스에 동시에 결속될 수 있다. 서비스와 결속된 모든 컴포넌트가 제거된 후에야, 서비스는 제거될 수 있다.

 

 

서비스에 대해 더 알아야 할 내용들

 

위 문서에서는 서비스의 2가지 유형에 대해 일반적인 내용을 언급하고 있으나, 우리가 사용하고자 하는 서비스는 이 두 가지 방식 모두 이용할 수 있다.

 

서비스는 <Started - 무한정 작동하는> 서비스가 될 수도 있고 <Bound - 결속되어 작동되는> 서비스가 될 수도 있다.

 

 

[onStartCommand()] 라는 메소드는 컴포넌트로 하여금 서비스를 시작하게 할 수 있다.

 

[onBind()] 라는 메소드는 컴포넌트로 하여금 서비스와 결속될 수 있게 해준다.

 

사용하고자 하는 서비스가 [Started], [Bound] 혹은 이 둘을 결합한 것이든간에, 안드로이드에 존재하는 모든 컴포넌트는 서비스를 시작시킬 수 있다.

 

액티비티 컴포넌트 같은 경우는 Intent를 사용해서 서비스를 시작한다.

 

하지만, 서비스를 private형태(다른 앱에서 사용할 수 없게) 매니페스트 파일에 작성할 것을 권장한다.

 

[주의사항] : 서비스는 프로세스의 메인스레드에서 동작한다. 즉 서비스는 자신의 기능을 작동시키기 위해서 별도의 스레드나 프로세스를 자체적으로 생성하지 않는다.

 

이것이 의미하는 것은, 만약 서비스 기능이 많은 CPU 자원을 소모하며, 동시에 일시적으로 정지해야 하는 기능을 필요로 한다면 별도의 스레드를 이용해 그와 관련된 작업을 처리해줘야 한다는 것이다.

 

별도의 스레드를 생성함으로써 Application Not Responding(ANR) 에러를 사전에 예방할 수 있고, 애플리케이션의 메인 스레드는 자기가 담당 하는 원래 업무에 집중할 수 있다.

 

감사합니다 ^_^