서비스 만들기

Xamarin.Android 서비스는 Android 서비스의 두 가지 불가침 규칙을 준수해야 합니다.

Android 서비스의 또 다른 요구 사항은 AndroidManifest.xml 등록하고 고유한 이름을 지정해야 한다는 것입니다. Xamarin.Android는 빌드 시 필요한 XML 특성을 사용하여 매니페스트에 서비스를 자동으로 등록합니다.

이 코드 조각은 다음 두 요구 사항을 충족하는 Xamarin.Android에서 서비스를 만드는 가장 간단한 예제입니다.

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

컴파일 시 Xamarin.Android는 다음 XML 요소를 AndroidManifest.xml 삽입하여 서비스를 등록합니다(Xamarin.Android가 서비스에 대한 임의 이름을 생성했음을 확인).

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

서비스를 내보내서 다른 Android 애플리케이션과 공유할 수 있습니다. 이 작업은 .에 속성을 설정 Exported 하여 수행됩니다 ServiceAttribute. 서비스를 내보 ServiceAttribute.Name 낼 때 서비스에 의미 있는 공용 이름을 제공하도록 속성을 설정해야 합니다. 이 코드 조각은 서비스를 내보내고 이름을 지정하는 방법을 보여 줍니다.

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

그러면 이 서비스의 AndroidManifest.xml 요소는 다음과 같이 표시됩니다.

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

서비스에는 서비스가 생성될 때 호출되는 콜백 메서드가 포함된 고유한 수명 주기가 있습니다. 정확히 어떤 메서드가 호출되는지는 서비스 유형에 따라 달라집니다. 시작된 서비스는 바인딩된 서비스와 다른 수명 주기 메서드를 구현해야 하며 하이브리드 서비스는 시작된 서비스와 바인딩된 서비스 모두에 대한 콜백 메서드를 구현해야 합니다. 이러한 메서드는 클래스의 Service 모든 멤버입니다. 서비스를 시작하는 방법에 따라 호출할 수명 주기 메서드가 결정됩니다. 이러한 수명 주기 메서드는 나중에 자세히 설명합니다.

기본적으로 서비스는 Android 애플리케이션과 동일한 프로세스에서 시작됩니다. 속성을 true로 설정 ServiceAttribute.IsolatedProcess 하여 자체 프로세스에서 서비스를 시작할 수 있습니다.

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

다음 단계는 서비스를 시작하는 방법을 검사한 다음, 세 가지 유형의 서비스를 구현하는 방법을 검사하는 것입니다.

참고 항목

서비스는 UI 스레드에서 실행되므로 UI를 차단하는 작업을 수행해야 하는 경우 서비스는 스레드를 사용하여 작업을 수행해야 합니다.

서비스 시작

Android에서 서비스를 시작하는 가장 기본적인 방법은 시작할 서비스를 식별하는 데 도움이 되는 메타 데이터가 포함된 서비스를 디스패치 Intent 하는 것입니다. 서비스를 시작하는 데 사용할 수 있는 의도에는 두 가지 스타일이 있습니다.

  • 명시적 의도명시적 의도 는 지정된 작업을 완료하는 데 사용해야 하는 서비스를 정확히 식별합니다. 명시적 의도는 특정 주소가 있는 문자로 간주할 수 있습니다. Android는 명시적으로 식별된 서비스로 의도를 라우팅합니다. 이 코드 조각은 명시적 의도를 사용하여 다음과 같은 DownloadService서비스를 시작하는 한 가지 예입니다.

    // Example of creating an explicit Intent in an Android Activity
    Intent downloadIntent = new Intent(this, typeof(DownloadService));
    downloadIntent.data = Uri.Parse(fileToDownload);
    
  • 암시적 의도 – 이 유형의 의도는 사용자가 수행하려는 작업 유형을 느슨하게 식별하지만 해당 작업을 완료하기 위한 정확한 서비스는 알 수 없습니다. 암시적 의도는 "우려할 수 있는 대상..."이라는 문자로 생각할 수 있습니다. Android는 의도의 내용을 검사하고 의도와 일치하는 기존 서비스가 있는지 확인합니다.

    의도 필터는 등록된 서비스와 암시적 의도를 일치시킬 수 있도록 하는 데 사용됩니다. 의도 필터는 서비스를 암시적 의도와 일치시키는 데 필요한 메타 데이터를 포함하는 AndroidManifest.xml 추가되는 XML 요소입니다.

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

Android에 암시적 의도와 일치하는 항목이 두 개 이상 있는 경우 사용자에게 작업을 처리할 구성 요소를 선택하도록 요청할 수 있습니다.

Screenshot of a disambiguation dialog

Important

Android 5.0(AP 수준 21)부터는 암시적 의도를 사용하여 서비스를 시작할 수 없습니다.

가능한 경우 애플리케이션은 명시적 의도를 사용하여 서비스를 시작해야 합니다. 암시적 의도는 특정 서비스를 시작하도록 요청하지 않습니다. 이는 요청을 처리하기 위해 디바이스에 설치된 일부 서비스에 대한 요청입니다. 이 모호한 요청으로 인해 요청 또는 다른 앱을 불필요하게 처리하는 잘못된 서비스가 발생할 수 있습니다(디바이스의 리소스에 대한 부담이 증가함).

의도를 디스패치하는 방법은 서비스 유형에 따라 달라지며 각 서비스 유형과 관련된 가이드의 뒷부분에서 자세히 설명합니다.

암시적 의도에 대한 의도 필터 만들기

서비스를 암시적 의도와 연결하려면 Android 앱이 서비스의 기능을 식별하기 위해 일부 메타 데이터를 제공해야 합니다. 이 메타 데이터는 의도 필터에 의해 제공됩니다. 의도 필터에는 서비스를 시작하려면 의도에 있어야 하는 작업 또는 데이터 형식과 같은 일부 정보가 포함됩니다. Xamarin.Android에서 의도 필터는 서비스를 IntentFilterAttribute데코레이팅하여 AndroidManifest.xml 등록됩니다. 예를 들어 다음 코드는 다음과 같은 관련 작업을 com.xamarin.DemoService사용하여 의도 필터를 추가합니다.

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

그러면 항목이 AndroidManifest.xml 파일에 포함됩니다. 다음 예제와 유사한 방식으로 애플리케이션과 함께 패키지된 항목입니다.

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

Xamarin.Android 서비스의 기본 사항을 통해 다양한 서비스의 하위 유형을 자세히 살펴보겠습니다.