백그라운드에서 오래 실행되는 작업을 수행할 수 있는 어플리케이션 구성요소이며 UI를 제공하지 않는다.
액티비티와 비슷하게 끝나는 백그라운드 작업 ⇒ Thread, AsyncTask, HandlerThread
어플 종료후에도 지속되어야 하는 작업 ⇒ Service
<aside> 💡 서비스는 Main 스레드에서 실행되므로 꼭 필요한 경우에만 사용하여야 한다. CPU 집약적인 작업을 수행할 경우, ANR 오류가 발생 가능하므로 서비스 내에서 새 스레드를 생성하여야 한다.
</aside>
사용자에게 잘 보이는 작업을 수행한다. 알림을 표시해야 하며, 사용자와 상호작용하지 않을 때도 계속 실행된다.
사용자에게 직접 보이지 않는 작업을 수행한다.
<aside> 💡 Api26에서 Background Service 제한이 강화되었다. (WorkManager, AlarmManager
</aside>
클라이언트-서버 인터페이스를 제공하여 구성요소가 서비스와 상호작용하게 하며, 결과를 받을 수도 있고 심지어 이와 같은 작업을 여러 프로세스에 걸쳐 프로세스간 통신(IPC)으로 수행할 수도 있다. 바인딩이 해제되면 서비스는 소멸된다.
<aside> 💡 하나의 서비스를 서비스(Background, Foreground)와 Bind 서비스 동시 작동 가능
</aside>
<manifest ... >
...
<application ... >
<service android:name=".ExampleService" />
...
</application>
</manifest>
애플리케이션을 게시한 후에는 이름(andorid:name)을 그대로 두어야 서비스를 시작 또는 바인딩할 명시적 인텐트에 대한 종속성 때문에 코드가 깨질 위험을 막을 수 있다.
android:exported 의 값을 통해 서비스를 본인의 앱에서만 사용가능하게 제한할지, 외부 앱에서도 허용할지 정할 수 있다.
<aside>
💡 앱의 보안을 위해서는 명시적 인텐트만 사용하고, 인텐트 필터를 선언해서는 안된다. 암시적 인텐트를 사용하여 서비스를 시작하면, 인텐트에 어떤 서비스가 응답할지 확신할 수 없고, 사용자는 어느 서비스가 시작되는 지 볼 수 없다. ⇒ 악용 가능
(Api21 부터 암시적 인텐트로 bindService() 를 호출하면 예외 발생)
</aside>

왼쪽은 Service로 실행(클라이언트가 startService() 호출 후, onStartCommand()), 오른쪽은 Bind Service로 실행(클라이언트가 bindService() 호출 후, onBind())
(위에서 언급하였듯이, 모든 서비스는 클라이언트와 바인딩되도록 허용할 수 있다)
서비스의 전체 수명은 onCreate() → onDestroy()
서비스의 활성 수명은 onStartCommand() or onBind() 부터 시작된다.