Bagikan melalui


Layanan Niat di Xamarin.Android

Layanan mulai dan terikat berjalan pada utas utama, yang berarti bahwa untuk menjaga performa tetap lancar, layanan perlu melakukan pekerjaan secara asinkron. Salah satu cara paling sederhana untuk mengatasi masalah ini adalah dengan pola prosesor antrean pekerja, di mana pekerjaan yang harus dilakukan ditempatkan dalam antrean yang dilayankan oleh satu utas.

IntentService adalah subkelas Service kelas yang menyediakan implementasi spesifik Android dari pola ini. Ini akan mengelola pekerjaan antrean, memulai utas pekerja untuk melayani antrean, dan menarik permintaan dari antrean untuk dijalankan pada utas pekerja. Akan IntentService diam-diam berhenti sendiri dan menghapus utas pekerja ketika tidak ada lagi pekerjaan dalam antrean.

Pekerjaan dikirimkan ke antrean dengan membuat Intent lalu meneruskan itu Intent ke StartService metode .

Tidak dimungkinkan untuk menghentikan atau mengganggu OnHandleIntent metode IntentService saat sedang bekerja. Karena desain ini, IntentService harus dijaga tanpa status - seharusnya tidak mengandalkan koneksi atau komunikasi aktif dari aplikasi lainnya. IntentService Dimaksudkan untuk memproses permintaan kerja secara stateless.

Ada dua persyaratan untuk subkelas IntentService:

  1. Jenis baru (dibuat dengan subkelas IntentService) hanya mengambil alih OnHandleIntent metode.
  2. Konstruktor untuk jenis baru memerlukan string yang digunakan untuk memberi nama utas pekerja yang akan menangani permintaan. Nama utas pekerja ini terutama digunakan saat men-debug aplikasi.

Kode berikut menunjukkan IntentService implementasi dengan metode penimpaan OnHandleIntent :

[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");
    }
}

Pekerjaan dikirim ke dengan IntentService membuat instans Intent dan kemudian memanggil metode dengan Niat tersebut StartService sebagai parameter. Niat akan diteruskan ke layanan sebagai parameter dalam OnHandleIntent metode . Cuplikan kode ini adalah contoh pengiriman permintaan kerja ke Niat:

// 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 dapat mengekstrak nilai dari Niat, seperti yang ditunjukkan dalam cuplikan kode ini:

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

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