创建后台服务

IntentService 类提供了一种简单的结构,用于在一个后台线程上运行操作。这使得它能够处理长时间运行的操作,而不会影响用户界面的响应能力。IntentService 也不会受大多数用户界面生命周期事件的影响,因此它可以在关闭AsyncTask 的情况下继续运行。

IntentService 有一些限制

  • 它无法直接与用户界面交互。要将结果显示在 UI 中,您必须将其发送到Activity
  • 工作请求按顺序运行。如果IntentService 中正在运行操作,并且您向其发送另一个请求,则该请求将等待第一个操作完成。
  • IntentService 上运行的操作无法中断。

但是,在大多数情况下,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 的过程。