Aracılığıyla paylaş


Xamarin.Android'de Intent Services

Hem başlatılan hem de bağlı hizmetler ana iş parçacığında çalıştırılır, yani performansı sorunsuz tutmak için bir hizmetin işi zaman uyumsuz olarak gerçekleştirmesi gerekir. Bu sorunu gidermenin en basit yollarından biri, yapılacak işin tek bir iş parçacığı tarafından hizmet edilen bir kuyruğa yerleştirildiği çalışan kuyruğu işlemci düzenidir.

IntentService, bu desenin Service Android'e özgü bir uygulamasını sağlayan sınıfının bir alt sınıfıdır. Kuyruğa alma işini yönetir, kuyruğa hizmet vermek için bir çalışan iş parçacığı başlatır ve çalışan iş parçacığında çalıştırılacak istekleri kuyruktan çeker. , IntentService kuyrukta daha fazla iş olmadığında sessizce durur ve çalışan iş parçacığını kaldırır.

Çalışma, bir Intent oluşturulup yöntemine geçirilerek IntentStartService kuyruğa gönderilir.

Çalışırken yöntemi IntentService durdurmak veya kesmek OnHandleIntent mümkün değildir. Bu tasarım nedeniyle, bir IntentService durum bilgisi olmayan tutulmalıdır; uygulamanın geri kalanından gelen etkin bir bağlantıya veya iletişime güvenmemelidir. , IntentService iş isteklerini durum bilgisi olmayan bir şekilde işlemeye yöneliktir.

Alt sınıflama IntentServiceiçin iki gereksinim vardır:

  1. Yeni tür (alt sınıflamayla IntentServiceoluşturulur) yalnızca yöntemini geçersiz kılar OnHandleIntent .
  2. Yeni tür oluşturucu, istekleri işleyecek çalışan iş parçacığını adlandırmak için kullanılan bir dize gerektirir. Bu çalışan iş parçacığının adı öncelikli olarak uygulamada hata ayıklanırken kullanılır.

Aşağıdaki kod, geçersiz kılınan OnHandleIntent yöntemiyle bir IntentService uygulamayı gösterir:

[Service]
public class DemoIntentService: IntentService
{
    public DemoIntentService () : base("DemoIntentService")
    {
    }

    protected override void OnHandleIntent (Android.Content.Intent intent)
    {
        Console.WriteLine ("perform some long running work");
        ...
        Console.WriteLine ("work complete");
    }
}

Bir örneği oluşturup Intent ardından bu Intent ile yöntemini parametre olarak çağırarak StartService öğesine iş gönderilirIntentService. Intent yönteminde bir parametre OnHandleIntent olarak hizmete geçirilir. Bu kod parçacığı, bir Amada iş isteği gönderme örneğidir:

// This code might be called from within an Activity, for example in an event
// handler for a button click.
Intent downloadIntent = new Intent(this, typeof(DemoIntentService));

// This is just one example of passing some values to an IntentService via the Intent:
downloadIntent.PutExtra("file_to_download", "http://www.somewhere.com/file/to/download.zip");

StartService(downloadIntent);

IntentService, bu kod parçacığında gösterildiği gibi Intent içindeki değerleri ayıklayabilir:

protected override void OnHandleIntent (Android.Content.Intent intent)
{
    string fileToDownload = intent.GetStringExtra("file_to_download");

    Log.Debug("DemoIntentService", $"File to download: {fileToDownload}.");
}