Android Service与IntentService的区别

Service是IntentService的父类

Service即后台服务,与应用处于同一个线程,

IntentService可以说相当于一个工具类,把重复的代码帮我们封装起来了,

像以前我们写一个服务,要复写的方法有:onCreate(),onStart(),onBind(),onStartCommand()等等

而这些现在IntentService都已经帮我们做好了,

我们只要复写其抽象方法onHandlerIntent()方法就可以了,然后再这个方法里面接收intent参数等。

下面就结合源码对IntentService分析下:

public abstract class IntentService extends Service {
    private volatile Looper mServiceLooper;
    private volatile ServiceHandler mServiceHandler;
    private String mName;
    private boolean mRedelivery;
IntentService的基本域就是上面 这些,

Looper:用来获取当前线程

ServerHandler:用来处理消息


下面看下ServerHandler:

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);
    }
}
它是在处理消息时,先回调子类的onHandleIntent(Intent intent)方法,完了,再结束当前线程


下面再看下IntentService的onCreate()方法做了什么:

@Override
public void onCreate() {
    // TODO: It would be nice to have an option to hold a partial wakelock  // during processing, and to have a static startService(Context, Intent)
    // method that would launch the service & hand off a wakelock.

    super.onCreate();
    HandlerThread thread = new HandlerThread("IntentService[" + mName + "]");
    thread.start();

    mServiceLooper = thread.getLooper();
    mServiceHandler = new ServiceHandler(mServiceLooper);
}
很惊讶,它在这里面自己开了个线程HandlerThread来处理Intent,并实例化了ServiceHandler对象,


最后,看下onStart()方法:

@Override
public void onStart(Intent intent, int startId) {
    Message msg = mServiceHandler.obtainMessage();
    msg.arg1 = startId;
    msg.obj = intent;
    mServiceHandler.sendMessage(msg);
}
通过handler把消息发送出去,


这个IntentService与继承Service代码要简洁,且是另外开的线程,不会造成主线程阻塞的情况,特别是像那些耗时的操作,

所以快快把Service换成IntentService吧。。


你可能感兴趣的:(android)