Android应用大部分的操作都在UI线程中,在UI线程中执行长时间的操作会引起程序的ANR。为了避免这种情况,Android框架提供了几个类来帮助你把长时间的操作运行在后台。最有用的是IntentService。下面就介绍一下如何使用IntentService来执行长时间的操作。
IntentService类提供一个简单结构在后台执行操作,而不影响用户的操作。IntentService也不收大多数用户界面生命周期事件的影响。
一个IntentService有以下一些限制:
-
不能与用户界面直接交互,需要将结果发送到Activity
-
执行Service的请求是顺序执行的,如果你已经执行了一个IntentService,然后再发送一个请求这个请求会等第一个请求执行完毕后开始执行。
-
一个执行中的IntentService是没办法中断的
然而,在大多数情况下,IntentService是首选的方式来执行简单的后台操作。
创建IntentService
要为你的APP创建一个IntentService组件,需要继承IntentService类,并且在它内部覆盖onHandleIntent()方法。例如:
public class PullService extends IntentService {
@Override
protected void onHandleIntent(Intent workIntent) {
String dataString = workIntent.getDataString();
...
//执行操作
...
}
}
注意:在IntentService中应该避免重写onStartCommand()等方法,因为IntentService为自动调用它们。
在Mainifest中定义IntentService
<application
android:icon="@drawable/icon"
android:label="@string/app_name">
...
<service
android:name=".PullService"
android:exported="false"/>
...
<application/>
android:exported="false" 意味着这个Service只能在自己的App中使用
创建启动一个IntentService
Intent mServiceIntent = new Intent(getActivity(), RSSPullService.class);
mServiceIntent.setData(Uri.parse(dataUrl));
getActivity().startService(mServiceIntent);
当你调用startService()方法后,就会执行onHandleIntent中的方法,执行结束后结束自己。