一.IntentService的介绍
很多时候我们创建Service就是希望Service能在后台进行一些耗时操作,但是又由于Service默认是运行在主线程的,我们不太方便直接进行耗时操作,然后每次进行耗时操作我们都得手动创建新的线程,显得很麻烦。
所以就会有IntentService,它内部是帮我们创建了一个HandleThread,以及对应的Handler,并通过onStart方法把intent封装成message再send给了Handler,Handler就在他的handleMessage中会将Intent从Message中取出来,然后直接调用我们重写的onHandlerIntent去处理这个intent。
我们只需要在 onHandleIntent()
方法中去实现我们的业务代码即可。调用就是通过简单的startService去调用。
- 它本质是一种特殊的Service,继承自Service并且本身就是一个抽象类
- 它可以用于在后台执行耗时的异步任务,当任务完成后会自动停止
- 它拥有较高的优先级,不易被系统杀死(继承自Service的缘故),因此比较适合执行一些高优先级的异步任务
- 它内部通过HandlerThread和Handler实现异步操作
- 创建IntentService时,只需实现onHandleIntent和构造方法,onHandleIntent为异步方法,可以执行耗时操作
二.IntentService的使用姿势
- 通过借助Intent调用startService方法启动 IntentServcie并传递传递数据到IntentService
- startService(context, intentServcie.class)方法调用后,会把任务通过Intent传递到onHandleIntent() ,这个方法就是在子线程中运行的,进行一些网络请求等的耗时操作。
- 最后通过接口+Handler转换到主线程更新UI(也可通过Broadcast等方法传递消息到Activity)
看下面的demo:
通过IntentService从网上获取图片并显示
public class MyIntentService extends IntentService {
private static final String ACTION_FOO = "com.example.a11_text1.action.FOO";
private static final String EXTRA_PARAM1 = "com.example.a11_text1.extra.PARAM1";
private static final String EXTRA_PARAM2 = "com.example.a11_text1.extra.PARAM2";
//接口,用于更新ui时传递数据到Activity
public static UpdateUI updateUI;
private static int index;
public MyIntentService() {
super("MyIntentService");
}
public static void setUpdateUI(UpdateUI updateUIInterface){
updateUI=updateUIInterface;
}
public static void startActionFoo(Context context, String param1,int i) {
Intent intent = new Intent(context, MyIntentService.class);
intent.setAction(ACTION_FOO);
intent.putExtra(EXTRA_PARAM1, param1);
intent.putExtra(EXTRA_PARAM2,i);
index = i;
context.startService(intent);
}
@Override
protected