IntentService
类提供了一个简单的结构来在单个后台线程上运行操作。这使它能够处理长时间运行的操作,而不会影响用户界面的响应能力。此外,IntentService
不受大多数用户界面生命周期事件的影响,因此它可以在使 AsyncTask
关闭的情况下继续运行。
IntentService
有几个限制
- 它无法直接与用户界面交互。要将结果放入 UI,您必须将其发送到
Activity
。 - 工作请求按顺序运行。如果一个操作正在
IntentService
中运行,并且您向其发送另一个请求,则该请求将等待第一个操作完成。 - 在
IntentService
上运行的操作无法中断。
但是,在大多数情况下,IntentService
是执行简单后台操作的首选方法。
本指南将向您展示如何执行以下操作
- 创建您自己的
IntentService
子类。 - 创建所需的回调方法
onHandleIntent()
。 - 在清单文件中定义
IntentService
。
处理传入的意图
要为您的应用创建 IntentService
组件,请定义一个扩展 IntentService
的类,并在其中定义一个覆盖 onHandleIntent()
的方法。例如
Kotlin
class RSSPullService : IntentService(RSSPullService::class.simpleName) override fun onHandleIntent(workIntent: Intent) { // Gets data from the incoming Intent val dataString = workIntent.dataString ... // Do work here, based on the contents of dataString ... } }
Java
public class RSSPullService extends IntentService { @Override protected void onHandleIntent(Intent workIntent) { // Gets data from the incoming Intent String dataString = workIntent.getDataString(); ... // Do work here, based on the contents of dataString ... } }
请注意,常规 Service
组件的其他回调(例如 onStartCommand()
)会由 IntentService
自动调用。在 IntentService
中,应避免覆盖这些回调。
要了解有关创建 IntentService
的更多信息,请参阅扩展 IntentService 类。
在清单中定义意图服务
IntentService
还需要在您的应用清单中进行条目。将其作为 <service>
元素提供,该元素是 <application>
元素的子元素
<application android:icon="@drawable/icon" android:label="@string/app_name"> ... <!-- Because android:exported is set to "false", the service is only available to this app. --> <service android:name=".RSSPullService" android:exported="false"/> ... </application>
属性 android:name
指定 IntentService
的类名。
请注意,<service>
元素不包含意图过滤器。发送工作请求到服务的 Activity
使用显式 Intent
,因此不需要过滤器。这也意味着只有同一应用中的组件或具有相同用户 ID 的其他应用才能访问该服务。
现在您有了基本的 IntentService
类,您可以使用 Intent
对象向其发送工作请求。构建这些对象并将其发送到 IntentService
的过程在向后台服务发送工作请求中进行了描述。