共用方式為


Xamarin.Android 中的意圖服務

啟動和系結服務都會在主線程上執行,這表示為了保持效能順暢,服務必須以異步方式執行工作。 解決此問題最簡單的方式之一是使用 背景工作佇列處理器模式,其中要完成的工作會放在由單個線程服務的佇列中。

IntentService是類別的Service子類別,可提供此模式的Android特定實作。 它會管理佇列工作、啟動背景工作線程以服務佇列,以及從要於背景工作線程上執行的佇列提取要求。 IntentService會在佇列中沒有其他工作時,悄悄停止自己並移除背景工作線程。

工作會藉由建立 Intent ,然後將它 Intent 傳遞至 方法,以提交至 StartService 佇列。

無法在工作時停止或中斷 OnHandleIntent 方法 IntentService 。 由於此設計, IntentService 應該保持無狀態 – 它不應該依賴來自應用程式其餘部分的作用中聯機或通訊。 IntentService是用來無狀態處理工作要求。

子類別 IntentService化有兩個需求:

  1. 新類型(由子類別 IntentService化所建立)只會覆寫 OnHandleIntent 方法。
  2. 新類型的建構函式需要一個字串,用來為處理要求的背景工作線程命名。 偵錯應用程式時,主要會使用此背景工作線程的名稱。

下列程式代碼顯示 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}.");
}