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
:
- Jenis baru (dibuat dengan subkelas
IntentService
) hanya mengambil alihOnHandleIntent
metode. - 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}.");
}