我们先不扯IntentService是什么什么的,扯那么东西都太空洞,不如看源码来的深刻
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);
//停掉Service,会执行onDestory方法
stopSelf(msg.arg1);
}
}
public IntentService(String name) {
super();
mName = name;
}
public void setIntentRedelivery(boolean enabled) {
mRedelivery = enabled;
}
@Override
public void onCreate() {
super.onCreate();
//开启一个HandlerThread,得到子线程中的Looper
HandlerThread thread = new HandlerThread("IntentService[" + mName + "]");
thread.start();
mServiceLooper = thread.getLooper();
mServiceHandler = new ServiceHandler(mServiceLooper);
}
@Override
public void onStart(Intent intent, int startId) {
Message msg = mServiceHandler.obtainMessage();
msg.arg1 = startId;
msg.obj = intent;
//将intent发送到Handler中去执行
mServiceHandler.sendMessage(msg);
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
onStart(intent, startId);
//设置设置mRedelivery为true,服务销毁,系统就会重新创建了这个服务
//不设置或者设置为false,系统不会重新创建,直到接受到新的Intent对象
return mRedelivery ? START_REDELIVER_INTENT : START_NOT_STICKY;
}
@Override
public void onDestroy() {
//退出Looper
mServiceLooper.quit();
}
@Override
public IBinder onBind(Intent intent) {
return null;
}
//我们使用IntentService只需要重写这个方法去处理我们发送的Intent
@WorkerThread
protected abstract void onHandleIntent(Intent intent);
}
注解已经写的很详细,下面补充两点:
Service不是独立的进程,也不是独立的线程,它是依赖于应用程序的主线程的,也就是说,在更多时候不建议在Service中
编写耗时的逻辑和操作,否则会引起ANR。
IntentService执行完所一个Intent请求对象所对应的工作之后,如果没有新的Intent请求达到,
则自动停止Service,否则执行下一个Intent请求所对应的任务