【后台任务】创建一个后台服务(10)

概要


IntentService类提供用于在单个后台线程中运行的操作的简单的结构。这允许它处理长时间运行的操作,而不会影响用户界面的响应。此外,一个 IntentService不受大多数​​用户界面生命周期事件的影响,所以它会继续运行在会关闭一个AsyncTask

一个IntentService有一些限制:

  • 它不能直接与您的用户界面进行交互。要将其结果放入UI中,您必须将它们发送给用户Activity。
  • 工作请求按顺序运行。如果某个操作正在运行 IntentService,并且您发送了另一个请求,则该请求会一直等到第一个操作完成。
  • 在一个运行的操作IntentService不能被中断。
    但是,在大多数情况下,an IntentService是执行简单后台操作的首选方式。

本课向您展示如何创建自己的子类IntentService。该课程还向您展示了如何创建所需的回调方法 onHandleIntent()。最后,课程介绍了如何IntentService在清单文件中定义清单。

处理传入的意图


要IntentService为您的应用创建组件,请定义一个扩展的类IntentService,并在其中定义一个覆盖的方法onHandleIntent()。例如:

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下一课将介绍构建这些对象并将它们发送给您的过程。

Lastest Update:2018.04.24

联系我

QQ:94297366
微信打赏:https://pan.baidu.com/s/1dSBXk3eFZu3mAMkw3xu9KQ

公众号推荐:

【后台任务】创建一个后台服务(10)

猜你喜欢

转载自blog.51cto.com/4789781/2124447