Xamarin.Android 中的意图服务

启动的服务和绑定的服务都在主线程上运行,这意味着要保持性能流畅,服务需要异步执行工作。 解决这一问题的最简单方法之一是采用辅助角色队列处理器模式,即将要完成的工作放在一个由单个线程处理的队列中。

IntentServiceService 类的子类,它提供了该模式的 Android 特定实现。 它将管理工作排队,启动工作线程以处理队列,以及从要在工作线程上运行的队列拉取请求。 当队列中没有更多工作时,IntentService 会自动停止并移除工作线程。

通过创建 Intent 并将该 Intent 传递给 StartService 方法,将工作提交到队列中。

OnHandleIntent方法IntentService工作时,无法停止或中断方法。 因此,IntentService 应保持无状态 - 它不应依赖于活动连接或应用程序其他部分的通信。 IntentService 用于无状态处理工作请求。

子类化 IntentService 有两个要求:

  1. 新类型(通过子类化 IntentService 创建)只替代 OnHandleIntent 方法。
  2. 新类型的构造函数需要一个字符串,用来命名处理请求的工作线程。 此工作线程的名称主要在调试应用程序时使用。

下面的代码显示了带有替代 OnHandleIntent 方法的 IntentService 实现:

[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,然后使用该 Intent 作为参数调用 StartService 方法,将工作发送到 IntentService。 Intent 将作为 OnHandleIntent 方法的参数传递给服务。 此代码片段是向 Intent 发送工作请求的示例:

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