Xamarin.Android 中的意图服务
启动的服务和绑定的服务都在主线程上运行,这意味着要保持性能流畅,服务需要异步执行工作。 解决这一问题的最简单方法之一是采用辅助角色队列处理器模式,即将要完成的工作放在一个由单个线程处理的队列中。
IntentService
是 Service
类的子类,它提供了该模式的 Android 特定实现。 它将管理工作排队,启动工作线程以处理队列,以及从要在工作线程上运行的队列拉取请求。 当队列中没有更多工作时,IntentService
会自动停止并移除工作线程。
通过创建 Intent
并将该 Intent
传递给 StartService
方法,将工作提交到队列中。
在OnHandleIntent
方法IntentService
工作时,无法停止或中断方法。 因此,IntentService
应保持无状态 - 它不应依赖于活动连接或应用程序其他部分的通信。 IntentService
用于无状态处理工作请求。
子类化 IntentService
有两个要求:
- 新类型(通过子类化
IntentService
创建)只替代OnHandleIntent
方法。 - 新类型的构造函数需要一个字符串,用来命名处理请求的工作线程。 此工作线程的名称主要在调试应用程序时使用。
下面的代码显示了带有替代 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}.");
}