서비스 만들기Creating a Service

Xamarin Android 서비스는 Android 서비스의 두 가지 inviolable 규칙을 준수 해야 합니다.Xamarin.Android services must obey two inviolable rules of Android services:

Android 서비스의 또 다른 요구 사항은 Androidmanifest 에 등록 하 고 고유한 이름을 지정 해야 한다는 것입니다.Another requirement of Android services is that they must be registered in the AndroidManifest.xml and given a unique name. Xamarin.ios는 빌드 시 필요한 XML 특성을 사용 하 여 매니페스트에 서비스를 자동으로 등록 합니다.Xamarin.Android will automatically register the service in the manifest at build time with the necessary XML attribute.

이 코드 조각은 이러한 두 요구 사항을 충족 하는 Xamarin Android에서 서비스를 만드는 가장 간단한 예제입니다.This code snippet is the simplest example of creating a service in Xamarin.Android that meets these two requirements:

[Service]
public class DemoService : Service
{
    // Magical code that makes the service do wonderful things.
}

컴파일 시 Xamarin.ios는 다음 XML 요소를 Androidmanifest 에 삽입 하 여 서비스를 등록 합니다. 즉, xamarin.ios에서 서비스에 대 한 무작위 이름을 생성 합니다.At compile time, Xamarin.Android will register the service by injecting the following XML element into AndroidManifest.xml (notice that Xamarin.Android generated a random name for the service):

<service android:name="md5a0cbbf8da641ae5a4c781aaf35e00a86.DemoService" />

다른 Android 응용 프로그램을 내보내 서비스를 공유할 수 있습니다.It is possible to share a service with other Android applications by exporting it. 이렇게 하려면 ServiceAttribute에서 Exported 속성을 설정 합니다.This is accomplished by setting the Exported property on the ServiceAttribute. 서비스를 내보내는 경우 서비스에 대 한 의미 있는 공개 이름을 제공 하도록 ServiceAttribute.Name 속성도 설정 해야 합니다.When exporting a service, the ServiceAttribute.Name property should also be set to provide a meaningful public name for the service. 이 코드 조각에서는 서비스를 내보내고 이름을 설명 하는 방법을 보여 줍니다.This snippet demonstrates how to export and name a service:

[Service(Exported=true, Name="com.xamarin.example.DemoService")]
public class DemoService : Service
{
    // Magical code that makes the service do wonderful things.
}

이 서비스에 대 한 Androidmanifest .xml 요소는 다음과 같습니다.The AndroidManifest.xml element for this service will then look something like:

<service android:exported="true" android:name="com.xamarin.example.DemoService" />

서비스는 서비스를 만들 때 호출 되는 콜백 메서드를 사용 하 여 자체 수명 주기를 가집니다.Services have their own lifecycle with callback methods that are invoked as the service is created. 호출 되는 메서드는 서비스 유형에 따라 달라 집니다.Exactly which methods are invoked depends on the type of service. 시작 된 서비스는 바인딩된 서비스와 다른 수명 주기 메서드를 구현 해야 하는 반면, 하이브리드 서비스는 시작 된 서비스와 바인딩된 서비스 모두에 대 한 콜백 메서드를 구현 해야 합니다.A started service must implement different lifecycle methods than a bound service, while a hybrid service must implement the callback methods for both a started service and a bound service. 이러한 메서드는 모두 Service 클래스의 멤버입니다. 서비스를 시작 하는 방법에 따라 호출 되는 수명 주기 방법이 결정 됩니다.These methods are all members of the Service class; how the service is started will determine what lifecycle methods will be invoked. 이러한 수명 주기 메서드는 나중에 자세히 설명 합니다.These lifecycle methods will be discussed in more detail later.

기본적으로 서비스는 Android 응용 프로그램과 동일한 프로세스에서 시작 됩니다.By default, a service will start in the same process as an Android application. ServiceAttribute.IsolatedProcess 속성을 true로 설정 하 여 자체 프로세스에서 서비스를 시작할 수 있습니다.It is possible to start a service in its own process by setting the ServiceAttribute.IsolatedProcess property to true:

[Service(IsolatedProcess=true)]
public class DemoService : Service
{
    // Magical code that makes the service do wonderful things, in it's own process!
}

다음 단계는 서비스를 시작 하는 방법을 검토 한 후로 이동 하 여 세 가지 유형의 서비스를 구현 하는 방법을 검사 하는 것입니다.The next step is to examine how to start a service and then move on to examine how to implement the three different types of services.

참고

서비스는 UI 스레드에서 실행 되므로 UI를 차단 하는 작업이 수행 되는 경우 서비스에서 스레드를 사용 하 여 작업을 수행 해야 합니다.A service runs on the UI thread, so if any work is to be performed which blocks the UI, the service must use threads to perform the work.

서비스 시작Starting A Service

Android에서 서비스를 시작 하는 가장 기본적인 방법은 시작할 서비스를 식별 하는 데 도움이 되는 메타 데이터를 포함 하는 Intent를 디스패치 하는 것입니다.The most basic way to start a service in Android is to dispatch an Intent which contains meta-data to help identify which service should be started. 서비스를 시작 하는 데 사용할 수 있는 두 가지 다른 스타일의 의도가 있습니다.There are two different styles of Intents that can be used to start a service:

  • 명시적 의도명시적 의도는 지정 된 작업을 완료 하는 데 사용 해야 하는 서비스를 정확 하 게 식별 합니다.Explicit Intent – An explicit Intent will identify exactly what service should be used to complete a given action. 명시적 의도는 특정 주소가 있는 문자로 간주할 수 있습니다. Android는 명시적으로 식별 된 서비스로 의도를 라우팅합니다.An explicit Intent can be thought of as a letter that has a specific address; Android will route the intent to the service that is explicitly identified. 이 코드 조각은 명시적 의도를 사용 하 여 DownloadService 라는 서비스를 시작 하는 한 가지 예입니다.This snippet is one example of using an explicit Intent to start a service called DownloadService:

    // Example of creating an explicit Intent in an Android Activity
    Intent downloadIntent = new Intent(this, typeof(DownloadService));
    downloadIntent.data = Uri.Parse(fileToDownload);
    
  • 암시적 의도 –이 유형의 의도는 사용자가 수행 하려는 동작의를 식별 하지만 해당 작업을 완료 하는 정확한 서비스는 알 수 없음입니다.Implicit Intent – This type of Intent loosely identifies the of action that the user wishes to perform, but the exact service to complete that action is unknown. 암시적 의도는 "문제를 해결할 수 있습니다." 라고 하는 문자로 간주할 수 있습니다.An implicit Intent can be thought of as a letter that is addressed "To Whom It May Concern...". Android는 의도 된 내용을 검사 하 고 해당 의도와 일치 하는 기존 서비스가 있는지 확인 합니다.Android will examine the contents of the Intent, and determine if there is an existing service which matches the intent.

    내재 된 필터 를 사용 하 여 등록 된 서비스와 암시적 의도를 일치 시킬 수 있습니다.An intent filter is used to help match the implicit intent with a registered service. 의도 필터는 서비스와 암시적 의도를 일치 시키는 데 도움이 되는 필요한 메타 데이터를 포함 하는 Androidmanifest 에 추가 되는 xml 요소입니다.An intent filter is an XML element that is added to AndroidManifest.xml which contains the necessary meta-data to help match a Service with an implicit intent.

    Intent sendIntent = new Intent("common.xamarin.DemoService");
    sendIntent.Data = Uri.Parse(fileToDownload);
    

Android가 암시적 의도에 대해 둘 이상의 가능한 일치 항목을 갖는 경우 사용자에 게 작업을 처리할 구성 요소를 선택 하도록 요청할 수 있습니다.If Android has more than one possible match for an implicit intent, then it may ask the user to select the component to handle the action:

명확성 대화 상자의 스크린샷Screenshot of a disambiguation dialog

중요

Android 5.0 (AP 수준 21)부터 암시적 의도를 사용 하 여 서비스를 시작할 수 없습니다.Starting in Android 5.0 (AP level 21) an implicit intent cannot be used to start a service.

가능 하면 응용 프로그램은 명시적 의도를 사용 하 여 서비스를 시작 해야 합니다.Where possible, applications should use explicit Intents to start a service. 암시적 의도는 특정 서비스가 요청을 처리 하기 위해 장치에 설치 된 서비스를 요청 하는 – 시작 하도록 요청 하지 않습니다.An implicit Intent does not ask for a specific service to start – it is a request for some service installed on the device to handle the request. 이 모호한 요청으로 인해 요청을 처리 하는 잘못 된 서비스 또는 다른 앱을 불필요 하 게 시작할 수 있습니다 .이로 인해 장치에서 리소스의 압력을 높일 수 있습니다.This ambiguous request can result in the wrong service handling the request or another app needlessly starting (which increases the pressure for resources on the device).

의도를 디스패치 하는 방법은 서비스 유형에 따라 다르며, 각 서비스 유형과 관련 된 가이드에서 나중에 자세히 설명 합니다.How the Intent is dispatched depends on the type of service and will be discussed in more detail later in the guides specific to each type of service.

암시적 의도에 대 한 의도 필터 만들기Creating an Intent Filter for Implicit Intents

서비스를 암시적 의도에 연결 하려면 Android 앱에서 서비스의 기능을 식별 하는 메타 데이터를 제공 해야 합니다.To associate a service with an implicit Intent, an Android app must provide some meta-data to identify the capabilities of the service. 이 메타 데이터는 _의도 필터_에 의해 제공 됩니다.This meta-data is provided by intent filters. 의도 필터에는 서비스를 시작 하기 위해 제공 해야 하는 작업 또는 데이터 유형과 같은 일부 정보가 포함 되어 있습니다.Intent filters contain some information, such as an action or a type of data, that must be present in an Intent to start a service. Xamarin Android에서 의도 필터는 서비스를 IntentFilterAttribute로 데코레이팅하는 방법으로 Androidmanifest 에 등록 됩니다.In Xamarin.Android, the intent filter is registered in AndroidManifest.xml by decorating a service with the IntentFilterAttribute. 예를 들어 다음 코드는 com.xamarin.DemoService 관련 된 작업을 사용 하 여 의도 필터를 추가 합니다.For example, the following code adds an intent filter with an associated action of com.xamarin.DemoService:

[Service]
[IntentFilter(new String[]{"com.xamarin.DemoService"})]
public class DemoService : Service
{
}

그러면 다음 예제와 유사한 방식으로 응용 프로그램과 함께 패키지 되는 항목을 – 하는 항목이 Androidmanifest .xml 파일에 포함 됩니다.This results in an entry being included in the AndroidManifest.xml file – an entry that is packaged with the application in a way analogous to the following example:

<service android:name="demoservice.DemoService">
    <intent-filter>
        <action android:name="com.xamarin.DemoService" />
    </intent-filter>
</service>

Xamarin Android 서비스의 기본 사항을 사용 하 여 다양 한 서비스 하위 유형을 더 자세히 살펴보겠습니다.With the basics of a Xamarin.Android service out of the way, let's examine the different subtypes of services in more detail.