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吧。。