서비스는 스레드를 생성하지 않고 메인 스레드에서 실행되기 때문에, 서비스의 작업이 많다면 성능의 저하가 오거나 '애플리케이션이 응답하지 않습니다(ANR)' 오류(오류가 나면 제거 되나요?)가 날 수 있기 때문에 서비스 내에서 별도의 스레드를 생성하여 사용한다면 위험을 줄일 수 있다.
onCreate()
안에 스레드를 생성하고 이를 onStart()
에서 실행시키고, onStop()
에서 중단하면 된다. Thread
클래스 대신 AsyncTask
또는 HandlerThread
를 사용하는 방안도 고려해보자 관련문서notification
을 통해 실행되고 있다고 알려야 한다. 예를들어 백그라운드에서 음악 플레이어가 실행되고 음악에 대한 정보를 notification을 통해 알려준다. 이 notification은 서비스가 중단되거나 foreground에서 제거되지 않는 이상 안드로이드 OS 시스템에 의해 제거 되지 않는다.
앱이 API 레벨 26이상
앱이 포그라운드에 있지 않을 때 시스템에서 백그라운드 서비스 실행에 대한 제한을 적용하고, 백그라운드 처리 가이드를 따라야 한다.예를 들어 앱이 저장소를 압축하는 데 서비스를 사용한다면 이는 사용자에게 알릴 필요가 없다.
bindService()
를 호출하여 해당 서비스와 바인딩 할 수 있다.Service
를 Implement
한다.startService()
를 호출하여 서비스가 시작된다면, 서비스가 stopSelf()
로 중지되거나 다른 component가 stopService
를 호출하기 전까지 서비스는 유지된다.bindService()
를 통해 생성된 서비스는 component가 서비스에 바인딩되어 있는 동안에만 실행되며, 서비스가 모든 클라이언트에서 바인딩이 해제된다면 시스템이 서비스를 삭제한다.Intent
를 넘겨 받을 수 있고, onStartCommand()
에서 핸들링 할 수 있다.아래의 콜백함수는 override가 필요한 콜백 메소드이다.
startService()
를 호출하게 되면 이 메소드가 실행되고 서비스가 시작된다.stopSelf()
또는 stopService()
메소드를 호출해야 한다.bindService()
를 호출하게 되면 이 메소드가 실행되고 서비스에 바인딩 된다.onCreate()
가 실행되며, Service에 대한 설정을 이 메소드에서 구현하도록 한다.onCreate()
는 onStartCommand()
또는 onBind()
를 호출하기 전에 호출되며 이미 서비스가 실행중일 경우에는 onCreate()
는 호출되지 않는다.onDestroy()
가 호출된다.onDestroy()
에서는 서비스에서 실행한 Thread, Listener, Reciever등의 리소스를 정리하도록 한다.<service>
요소를 <application>
요소의 하위로 추가하면 된다.<manifest ... >
...
<application ... >
<service android:name=".ExampleService" />
...
</application>
</manifest>
<service>
에 속성을 추가하여 필요한 권한과 특성을 정의할 수 있다
android:name
은 필수로 입력해야하며, 서비스의 클래스 이름을 입력한다.
앱의 보안을 위해 Service를 시작할 때는 항상 명시적 intent만 사용해야 한다.
Android 5.0(API 레벨21)부터 시스템은 개발자가 암시적 intent로 bindService()를 호출하면 예외를 발생시킨다.
android:exported="false"
속성을 추가하면 다른 앱에 의해 서비스가 실행되는 걸 막을 수 있다.
android:description
속성은 사용자에게 실행중인 서비스에 대한 설명을 제공하도록 하여 사용자가 서비스의 출처를 모르고 중단시키지 않도록 한다.