借鉴自开发艺术
构造方法中必须调用父类的有参构造
IntentService是一个抽象类
适合,需要高优先级的,短期的,后台耗时任务,执行完后会自动停止。
封装了HandlerThread和Handler。
@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); }
当他第一次被启动时,onCreate会被调用,会创建一个HandlerThread,然后使用它的Looper来构造一个Handler对象mServiceHandler。通过mServiceHandler发送的消息,都会在HandlerThread中执行。IntentService在onStartCommond中处理每个后台任务的Intent。
onStartCommand中调用了onStart
@Override public int onStartCommand(@Nullable Intent intent, int flags, int startId) { onStart(intent, startId); return mRedelivery ? START_REDELIVER_INTENT : START_NOT_STICKY; }
onStart
@Override public void onStart(@Nullable Intent intent, int startId) { Message msg = mServiceHandler.obtainMessage(); msg.arg1 = startId; msg.obj = intent; mServiceHandler.sendMessage(msg); }发送消息(包含intent),最后在onHandleIntent中处理
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调用完后停止他自身,采用的是带参数的stopSelf,带参会等全部消息处理完后才停止服务,无参数的会立刻停止服务。
每执行一个后台任务必须启动一次IntentService,不难得知,后台任务执行的顺序也如消息队列一样,按外界发起的顺序来执行。但是Service的特性是只有1个实例。当所有后台任务执行完后,执行onDestory。