서비스는 필요할때만 생성하는 것이 좋다. 

백그라운드에서 수행하지만, 사용자가 앱을 사용 중일 때만 동작해야 하는 상황에는 서비스 대신 스레드를 사용해야 한다. 예를 들어, 음악 재생 앱에서 앱이 수행되는 동안에만 음악을 재생해야 한다면 스레드를 사용, 앱이 종료되어도 계속 음악을 재생하려면 서비스를 사용해야 한다. AsyncTask도 고려할 수 있음

 서비스 사용시 주의 할점은 모든 컴포넌트는 메인 스레드에서 동작하므로 서비스가 수행하는 작업이 메인 스레드를 점유하는 일이라면 UI를 차단하지 않도록 서비스 내에서 스레드를 생성해야 한다 

 

강제 종료된 서비스를 사릴 수 있는 다양한 옵션. 

onStartCommand() 메소드가 반환하는 상수가 그러한 역할을 한다. 반환하는 상수에 따라 서비스가 강제로 종료되고 어떻게 되는지 나타낸다. 

 

START_NOT_STICKY - 전달할 인텐트가 있을때를 제외, 서비스가 중단되면 재생성하지 않음. 가장 일반적 옵션

START_STICKY - 서비스가 중단되면 서비스를 재시작하지만, 인텐트는 다시 전달하지 않음. 미디어 플레이어와 같이 서비스가 무기한으로 동작해야 할 때 적합. 

START_REDELIVER_INTENT - START_STICKY 와 다르게, 인텐트와 함께 서비스를 재시작한다. 파일 다운로드와 같이 무엇을 다운로드 했었는지 알아야 할 때 적합

 

서비스를 포함한 안드로이드 4대 컴포넌트 (액티비티, 리시버, 프로바이더, 서비스)는 메인스레드(UI스레드)에서 실행되므로 오래 걸리는 처리를 하게 되면 화면이 버벅대면서 ANR이 발생.

ANR이 발생을 막으려면 서비스 내에서 스레드를 생성해야 한다. 

 

서비스의 종료는 액티비티와 같은 컴포넌트에서 stopService()메소드를 사용, 서비스 내에서 stopSelf() 메소드를 사용해도 된다. 

 

Foreground서비스는 상태줄에 나타나고, 서비스를 유지시킴