백그라운드 서비스 만들기

IntentService 클래스는 단일 백그라운드 스레드에서 작업을 실행하기 위한 간단한 구조를 제공합니다. 이를 통해 사용자 인터페이스의 반응에 영향을 미치지 않고 장기 실행 작업을 처리할 수 있습니다. 또한, IntentService는 대부분의 사용자 인터페이스 수명 주기 이벤트의 영향을 받지 않으므로 AsyncTask를 종료하는 상황에서도 계속 실행됩니다.

IntentService에는 다음과 같은 몇 가지 제한사항이 있습니다.

  • 사용자 인터페이스와 직접 상호작용할 수 없습니다. UI에 결과를 넣으려면 Activity로 전송해야 합니다.
  • 작업 요청이 순차적으로 실행됩니다. 작업이 IntentService에서 실행 중인데 다른 요청을 보내면 요청은 첫 번째 작업이 완료될 때까지 대기합니다.
  • IntentService에서 실행되는 작업은 중단할 수 없습니다.

그러나 대부분의 경우 IntentService는 간단한 백그라운드 작업을 실행하는 데 선호되는 방법입니다.

이 가이드에서는 다음 작업을 실행하는 방법을 보여줍니다.

수신 인텐트 처리

앱의 IntentService 구성요소를 만들려면 IntentService를 확장하는 클래스를 정의하고 그 안에서 onHandleIntent()를 재정의하는 메서드를 정의합니다. 예를 들면 다음과 같습니다.

Kotlin

class RSSPullService : IntentService(RSSPullService::class.simpleName)

    override fun onHandleIntent(workIntent: Intent) {
        // Gets data from the incoming Intent
        val dataString = workIntent.dataString
        ...
        // Do work here, based on the contents of dataString
        ...
    }
}

자바

public class RSSPullService extends IntentService {
    @Override
    protected void onHandleIntent(Intent workIntent) {
        // Gets data from the incoming Intent
        String dataString = workIntent.getDataString();
        ...
        // Do work here, based on the contents of dataString
        ...
    }
}

정규 Service 구성요소의 다른 콜백(예: onStartCommand())은 IntentService에서 자동으로 호출합니다. IntentService에서 이러한 콜백을 재정의하면 안 됩니다.

IntentService 만들기에 관한 자세한 내용은 IntentService 클래스 확장을 참고하세요.

매니페스트에서 인텐트 서비스 정의

IntentService는 애플리케이션 매니페스트에도 항목이 필요합니다. 이 항목을 <application> 요소의 하위 요소인 <service> 요소로 제공합니다.

    <application
        android:icon="@drawable/icon"
        android:label="@string/app_name">
        ...
        <!--
            Because android:exported is set to "false",
            the service is only available to this app.
        -->
        <service
            android:name=".RSSPullService"
            android:exported="false"/>
        ...
    </application>

속성 android:nameIntentService의 클래스 이름을 지정합니다.

<service> 요소에는 인텐트 필터가 포함되어 있지 않습니다. 서비스로 작업 요청을 보내는 Activity는 명시적인 Intent를 사용하므로 필터가 필요하지 않습니다. 또한 동일한 앱 또는 동일한 사용자 ID를 가진 다른 애플리케이션의 구성요소만 서비스에 액세스할 수 있습니다.

이제 기본 IntentService 클래스가 있으므로 Intent 객체를 사용하여 이 클래스로 작업 요청을 보낼 수 있습니다. 이러한 객체를 구성하여 IntentService에 전송하는 절차는 백그라운드 서비스에 작업 요청 보내기에 설명되어 있습니다.