Xamarin.Android 中的意圖服務
啟動和系結服務都會在主線程上執行,這表示為了保持效能順暢,服務必須以異步方式執行工作。 解決此問題最簡單的方式之一是使用 背景工作佇列處理器模式,其中要完成的工作會放在由單個線程服務的佇列中。
IntentService
是類別的Service
子類別,可提供此模式的Android特定實作。 它會管理佇列工作、啟動背景工作線程以服務佇列,以及從要於背景工作線程上執行的佇列提取要求。 IntentService
會在佇列中沒有其他工作時,悄悄停止自己並移除背景工作線程。
工作會藉由建立 Intent
,然後將它 Intent
傳遞至 方法,以提交至 StartService
佇列。
無法在工作時停止或中斷 OnHandleIntent
方法 IntentService
。 由於此設計, IntentService
應該保持無狀態 – 它不應該依賴來自應用程式其餘部分的作用中聯機或通訊。 IntentService
是用來無狀態處理工作要求。
子類別 IntentService
化有兩個需求:
- 新類型(由子類別
IntentService
化所建立)只會覆寫OnHandleIntent
方法。 - 新類型的建構函式需要一個字串,用來為處理要求的背景工作線程命名。 偵錯應用程式時,主要會使用此背景工作線程的名稱。
下列程式代碼顯示 IntentService
具有覆寫 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");
}
}
工作會藉由具現化 Intent
,然後使用該意圖做為參數呼叫 StartService
方法,來傳送IntentService
工作。 意圖會以 方法中的 OnHandleIntent
參數的形式傳遞至服務。 此代碼段是將工作要求傳送至意圖的範例:
// 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
可以從 Intent 擷取值,如下列代碼段所示:
protected override void OnHandleIntent (Android.Content.Intent intent)
{
string fileToDownload = intent.GetStringExtra("file_to_download");
Log.Debug("DemoIntentService", $"File to download: {fileToDownload}.");
}