这些课程向你展示了如何通过把作业运行在后台来提高你的应用的性能和最小化电池消耗。
1.运行在一个后台服务中
除非你特别指定,否则你在应用中大部分的操作都是运行在一个称之为UI线程的前端线程中。这个会导致一系列问题,由于长时间的操作将会打扰到你的用户界面的响应性。这个会让你的用户感觉非常恼火,甚至会引起系统错误。为了避免这个,Android框架提供了几个类来帮忙我们把一部分的操作分担到另一个独立线程中。最有用的类是IntentService.
这节课描述了如何实现一个IntentService,向其发送工作请求,以及把其运行的结果反馈到其他的组件。
1.1 创建一个后台服务
IntentService类提供一个在单个后台线程运行一个操作的直观的结构。这个使得它能够处理长时间的操作而不影响到用户界面的响应性。同样,IntentService也不会受到大多数用户界面生命周期事件的影响,所以它会在关闭一个AsyncTask的情况下继续运行。
一个IntentService有几个限制:
- 它不能直接与你的用户界面进行交互。你必须把数据发送到Activity中,由Activity处理数据。
- 工作请求是串行执行。如果一个操作正在IntentService中运行,这个时候你又发了另外一个请求,此时这个请求会一直等待到第一个请求结束。
- 运行在IntentService中的操作不能被中断
然而,在大多数情况下一个IntentService是用于执行一个简单的后台操作的值得推荐的方式。
这节课向你展示了如何创建你的IntentService的子类以及如何创建一个需要的回调方法onHandleIntent().最后,课程描述了如何在你的manifest文件中声明IntentService。
创建一个IntentServcie
为了给你的应用创建一个IntentService组件,你需要定义一个从IntentServcie继承下来的子类,并且在其中覆盖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方法是由IntentServcie方法自动调用。在一个IntentService中,你应该避免覆盖这些回调函数。
在Manifest文件中定义IntentServcie
一个IntentService需要在应用manifest中找到一个入口。提供这个入口的标签是<service>。
<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元素并没有包含一个Intent过滤器。Activity通过一个具体的Intent发送工作请求到Service中,所以并不需要过滤器。这个也意味着只有在同一个应用或者具有相同用户ID的其他应用可以访问这个Service.
现在你有了基本的IntentService类,你可以通过Intent发送工作请求到其中。我们将会在下一节课中描述如何构造这些对象来发送到IntentService中的程序。
2.在后台加载数据
3.管理设备的唤醒状态