■ Android Service
Android Service 란 사용자가 응용프로그램을 종료 하거나 다른 응용프로그램으로 전환을 하더라도 백그라운드(화면으로 보이지 않는 뒷단)에서 장시간 계속해서 동작하도록 제공하는 기능입니다. 또한 구성 요소를 서비스에 bind하여 서비스와 상호작용할 수 있으며 다른 프로세스간의 통신을 수행 할 수도 있습니다.
미디어플레이어, MP3 플레이어, 알람앱 등이 Android Service를 이용한 App입니다.
Service 는 Thread 가 아니며, 아래와 같이 두 가지 형식을 제공합니다.
■ Started Service (시작된 서비스)
Activity 또는 BroadCastReceiver 와 같은 다른 애플리케이션 요소들이 Context.startService() 함수를 호출 함으로써 시작되게 됩니다. Service 는 한번 시작되면 Service 가 중단되거나 리소스 해제를 위해 안드로이드 런타임 시스템에 의해 해제 되는 시점까지 백그라운드에서 무한정 실행됩니다. Service 는 자신을 실행시킨 애플리케이션이(우리가 일반적으로 이야기하는 App) 더 이상 포그라운드(사용자 입장에서 봤을 때 실행 중 - 화면을 볼 수 있는 상태)에 있지 않아도 백그라운드에서 실행되고 있습니다.
Service 는 Context.stopService() 또는 stopSelf() 함수가 호출 되기 전까지 지속적으로 동작하게 됩니다.
Context.startService()의 중복 호출의 결과로 여러 차례 호출 결과를 받게 되더라도 중복 된 Context.startService() 호출이 중첩되지 않아 Context.stopService() 또는 stopSelf() 가 한번이라도 호출 되면 Service 는 중단되게 됩니다.
Service 는 안드로이드 시스템에 의해 높은 우선순위가 부여되며 리소스 해제를 위해 종료될 때도 가장 마지막에 고려 대상이 됩니다.
■ Bound Service (바인드된 서비스)
애플리케이션의 구성 요소가 자신에게 바인드될 수 있도록 허용하는 서비스이며, bindService() 를 호출하여 오래 지속되는 연결을 생성합니다.
Started Service 와 유사하지만 Started Service 는 결과를 반환하지 않으며 자신을 호출한 컴포넌트와의 상호작용도 허용하지 않는 반면 Bound Service 는 자신을 호출한 컴포넌트와의 상호작용을 허용하고 결과를 받을 수 있습니다. 즉, Activity 와 Application의 다른 구성요소에서 Service 와 상호작용하기를 원하는 경우 바인드된 서비스(Bound Service)를 생성해야 합니다. Application 의 기능 몇 가지를 프로세스 간 통신 (IPC : Interprocess Communication)을 통해 다른 Application 에 노출하고자 하는 경우에도 좋은 선택입니다.
클라이언트가 시작되어 bindService() 함수를 호출하면 Bound Service 에 바인딩 됩니다.
Bound Service 는 onBind() 콜백 함수를 구현하여야 합니다. Service가 최초 생성될 때와 그 이후에 다른 클라이언트들이 그 Service에 바인딩 할 때 모두 onBind() 함수가 자동 호출됩니다. onBind() 함수의 목적은 바인딩한 클라이언트들에게 IBinder 타입의 객체를 반환하는 것입니다.
다시 정리 하자면 클라이언트와 Service 사이에서 쓰이는 인터페이스는 반드시 IBinder 타입의 객체의 구현이어야 하며 이를 서비스가 onBind() 콜백 메서드에서 반환해야 합니다. 클라이언트가 IBinder 를 수신하면 해당 인터페이스를 통해 서비스와 상호작용을 시작할 수 있습니다.
클라이언트는 바인드된 서비스를 더 이상 필요로 하지 않을 시 unbindService() 를 호출해야 합니다. 마지막 바인딩 클라이언트가 Service 에서 바인딩을 해제하면 안드로이드 런타임 시스템이 해당 Service 를 종료 시킵니다.
■ Service Lifecycle (서비스 생명주기)
Service의 생명 주기는 Activity의 생명 주기보다 훨씬 간단하지만 Service를 생성하고 해제하는 방법에 특히 주의 해야 합니다. Service는 사용자가 모르는 채로 백그라운드에서 실행될 수 있기 때문입니다.
Service Lifecycle 은 아래 이미지와 같이 서로 다른 두 가지 경로를 따를 수 있습니다. 왼쪽이 Serviced Service 이며 오른쪽이 Bound Service 입니다. 참고하세요.
1. Started Service (시작된 서비스)
다른 구성 요소가 startService() 를 호출하면 Service 가 생성됩니다. Service는 무한정 실행 될 수 있으며 stopSelf()를 호출하여 자체적으로 중단해야 합니다. 또 다른 구성 요소도 Context.stopService()를 호출하여 Service를 중단할 수 있습니다. 서비스가 중단되면 안드로이드 런타임 시스템이 이를 소멸 시킵니다.
2. Bound Service (바인드된 서비스)
클라이언트가 bindService()를 호출하면 서비스가 생성됩니다. 클라이언트가 IBinder 인터페이스를 통해 서비스와 통신을 주고 받을 수 있으며 클라이언트가 연결을 종료하려면 unbindService() 를 호출하면 됩니다. 여러 클라이언트가 같은 Service에 바인드될 수 있으며, 이 모두가 바인딩을 해제하면 시스템이 해당 서비스를 소멸시킵니다. (Started Service 와 달리 Service가 스스로를 중단시키지 않아도 됩니다)
내용이 어렵게 느껴질 수 있겠는데요 ^^;
마지막 Service Lifecycle 부분이 Service 에 대한 요약이라 보시면 무방합니다.
Referenced By -
https://developer.android.com/reference/android/app/Service.html
'Android (Java)' 카테고리의 다른 글
[안드로이드 코딩_009] 안드로이드 인텐트와 인텐트 필터 (1회) (504) | 2017.07.28 |
---|---|
[안드로이드 코딩_008] Android Service (2회) (497) | 2017.07.25 |
[안드로이드 코딩_006]Activity LifeCycle (안드로이드 생명주기) (9) | 2017.04.28 |
[안드로이드 코딩_005]Android Studio UI (5) | 2017.02.22 |
[안드로이드 코딩_004]안드로이드 개발 시작 Hello world (669) | 2017.02.16 |