0
点赞
收藏
分享

微信扫一扫

Android IntentService 源码解析


概述

IntentService是Service的一个子类,相比于Service,有两个不同的地方

  1. 继承IntentService可以执行耗时操作,不用手动去创建线程
  2. 任务实行完毕之后,会调用stopSelf方法主动停止服务

使用方法

IntentService的使用和普通Service一样

Intent intent = new Intent(this,UploadService.class);
intent.setAction("ACTION_CALL_PHONE");
startService(intent);

public class UploadService extends IntentService {

public UploadService() {
//必须调用父类有参数的构造函数,这里的参数指定IntentService中线程的名称
super("UploadService");
}

@Override
protected void onHandleIntent(Intent intent) {
//这里的代码运行在新的线程
}

源码解析

下面我们从源码的角度去看看IntentService是如何实现上面两个功能的。

public abstract class IntentService extends Service {
private volatile Looper mServiceLooper;
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);
}
}

//构造函数,被系统调用,name的值是我们在构造函数中传入的值
public IntentService(String name) {
super();
mName = name;
}

public void setIntentRedelivery(boolean enabled) {
mRedelivery = enabled;
}

@Override
public void onCreate() {
super.onCreate();
//创建一个HandlerThread并启动
HandlerThread thread = new HandlerThread("IntentService[" + mName + "]");
thread.start();

mServiceLooper = thread.getLooper();
//利用HandlerThread的looper构造一个Handler对象,因为HandlerThread的关联的looper对象是在子线程中创建的,所以mServiceHandler的handleMessage方法就执行在子线程
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);
}


举报

相关推荐

0 条评论