定义
IntentService是Service的一个子类,用于处理异步请求,当调用startService方法时会开启一个新线程执行任务,并且在执行任务完成后自动停止自身
作用
处理异步请求,实现多线程
应用场景
1.按顺序在后台执行任务
2.不适合多个数据同时请求的场景
原理解析
public abstract class IntentService extends Service {
private volatile Looper mServiceLooper;
@UnsupportedAppUsage
private volatile ServiceHandler mServiceHandler;
private String mName;
private boolean mRedelivery;
private final class ServiceHandler extends Handler {
public ServiceHandler(Looper looper) {
super(looper);
}
@Override
public void handleMessage(Message msg) {
onHandleIntent((Intent)msg.obj);
stopSelf(msg.arg1);
}
}
public IntentService(String name) {
super();
mName = name;
}
@Override
public void onCreate() {
super.onCreate();
HandlerThread thread = new HandlerThread("IntentService[" + mName + "]");
thread.start();
mServiceLooper = thread.getLooper();
mServiceHandler = new ServiceHandler(mServiceLooper);
}
@Override
public void onStart(@Nullable Intent intent, int startId) {
Message msg = mServiceHandler.obtainMessage();
msg.arg1 = startId;
msg.obj = intent;
mServiceHandler.sendMessage(msg);
}
@Override
public int onStartCommand(@Nullable Intent intent, int flags, int startId) {
onStart(intent, startId);
return mRedelivery ? START_REDELIVER_INTENT : START_NOT_STICKY;
}
@Override
public void onDestroy() {
mServiceLooper.quit();
}
@Override
@Nullable
public IBinder onBind(Intent intent) {
return null;
}
@WorkerThread
protected abstract void onHandleIntent(@Nullable Intent intent);
}
- 1.在Service的onCreate中初始化了HandlerThread和Looper,由
- 2.mServiceHandler 绑定了HandlerThread的Looper
- 3.在在Service的onStart方法中利用mServiceHandler发送消息
- 4.在mServiceHandler的handleMessage调用onHandleIntent()方法(该方法是在子线程中执行,因为mServiceHandler绑定的是HandlerThread的Looper)
- 5.调用stopSelf()结束service自身
使用步骤
- 定义IntentService的子类,复写onHandleIntent方法
- 在AndroidManifest文件中注册service
- 调用startService启动服务
实例讲解
- 定义IntentService的子类,重写onHandleIntent方法
public class DownloadService extends IntentService {
public DownloadService() {
super("download service 2");
}
@Override
protected void onHandleIntent(Intent intent) {
String taskName = intent.getStringExtra("taskName");
MainLogUtil.d("onHandleIntent taskName = %s", taskName);
for (int i = 0; i < 5; i++) {
try {
MainLogUtil.d("onHandleIntent 任务 %s, taskName = %s,thread = %s",taskName,i,Thread.currentThread().getName());
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
@Override
public void onCreate() {
super.onCreate();
MainLogUtil.d("onCreate");
}
@Override
public int onStartCommand(@Nullable Intent intent, int flags, int startId) {
MainLogUtil.d("onStartCommand");
return super.onStartCommand(intent, flags, startId);
}
}
- AndroidManifest文件中注册Service
<service android:name=".DownloadService"/>
- 启动服务
Intent intent1 = new Intent(getContext(),DownloadService.class);
intent1.putExtra("taskName", "task1");
getContext().startService(intent1);
Intent intent2 = new Intent(getContext(),DownloadService.class);
intent2.putExtra("taskName", "task2");
getContext().startService(intent2);
测试结果
![](https://img.haomeiwen.com/i6280690/892eb6f0792abbd2.jpg)
对比
- IntentService与普通Service的区别
- IntentService会自动启动工作线程处理多线程任务,Service默认允许在主线程,需要手动创建工作线程处理任务
- IntentService在执行完任务后会自动结束自身,Service需要手动调用StopService结束自身
- IntentService与其他线程的区别
- IntentService的线程采用HandlerThread实现,其它线程是采用Thread或者Runnable实现
- IntentService继承了四大组件中的Service来做后台任务,优先级高,不易被进程杀死;普通线程所在的进程如果没有活动的四大组件,则改线程的优先级很低,容易被系统杀死
优点
1.启动服务后自动启动和管理线程,不用手动启动系统
2.任务执行完后会自动结束服务,不用手动stopService
3.任务顺序执行,不用考虑并发问题
缺点
1.由于IntentService采用的是HnadlerThread的线程模式,任务为按顺序逐一执行,因此不适合同时请求多个数据的场景
总结
- IntentService用于处理异步请求,适合执行单线程耗时任务场景
网友评论