intentService是什么?

IntentService继承自service,但是优先级高于Service。内部是封装handlerThread和handler的。

IntentService是继承并处理异步请求的一个类,在IntentService内有一个工作线程来处理耗时操作,启动IntentService的方式和启动传统的Service一样,并且,当任务执行完后,IntentService会自动停止,而不需要我们手动去控制或者stopSelf()。另外,可以启动IntentService多次,而每一个耗时操作会以工作队列的方式在IntentService的onHandlerIntent回调方法中执行(onHandlerIntent是执行IntentService耗时操作的一个方法),并且,每次只会执行一个工作线程,执行完第一个再执行第二个。所以他是串行的。

intentService使用方法

创建IntentService时,只需要实现onHandleIntent和构造方法,onHandleIntent为异步方法,可以执行耗时操作。构造方法里面传入一个字符串,这个字符串表示的是线程的名字。

 

源码开始,当然先从onCreate开始啦~为什么呢?略~~

 

1.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);    }

 1.创建了一个HandlerThread,所以证明IntentService内部是通过HandlerThread来进行异步消息的传递的。

 2.创建了一个looper,这个looper是HandlerThread的looper对象(HandlerThread是一个异步线程)

 3.创建了ServiceHandler.传入mServicelooper对象,这就使得ServiceHandler成为了处理异步线程的执行类了。

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);        }    }

Service执行onCreate后会执行onStartCommand()

 /**     * You should not override this method for your IntentService. Instead,     * override {@link #onHandleIntent}, which the system calls when the IntentService     * receives a start request.     * @see android.app.Service#onStartCommand     */    @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);    }

发送消息sendMessage(msg),Handle原理,也就知道,这个消息处理又回到serviceHandler里面的handleMessage做

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);        }    }

这handleMessage 可以看到onHandleIntent(),这个方法是一个抽象方法,留给继承的子类做实际操作

 @WorkerThread    protected abstract void onHandleIntent(@Nullable Intent intent);

执行了一个stopSelf(msg.arg1)我们知道还有一个sotpSelf()

两者区别:stopSelf()是会立即停止服务。有参数的会等待所有的任务都执行完,才会停止服务。

 

全部源码: 

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);        }    }    /**     * Creates an IntentService.  Invoked by your subclass's constructor.     *     * @param name Used to name the worker thread, important only for debugging.     */    public IntentService(String name) {        super();        mName = name;    }    /**     * Sets intent redelivery preferences.  Usually called from the constructor     * with your preferred semantics.     *     * 

If enabled is true, * {@link #onStartCommand(Intent, int, int)} will return * {@link Service#START_REDELIVER_INTENT}, so if this process dies before * {@link #onHandleIntent(Intent)} returns, the process will be restarted * and the intent redelivered. If multiple Intents have been sent, only * the most recent one is guaranteed to be redelivered. * *

If enabled is false (the default), * {@link #onStartCommand(Intent, int, int)} will return * {@link Service#START_NOT_STICKY}, and if the process dies, the Intent * dies along with it. */ public void setIntentRedelivery(boolean enabled) { mRedelivery = enabled; } @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); } @Override public void onStart(@Nullable Intent intent, int startId) { Message msg = mServiceHandler.obtainMessage(); msg.arg1 = startId; msg.obj = intent; mServiceHandler.sendMessage(msg); } /** * You should not override this method for your IntentService. Instead, * override {@link #onHandleIntent}, which the system calls when the IntentService * receives a start request. * @see android.app.Service#onStartCommand */ @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(); } /** * Unless you provide binding for your service, you don't need to implement this * method, because the default implementation returns null. * @see android.app.Service#onBind */ @Override @Nullable public IBinder onBind(Intent intent) { return null; } /** * This method is invoked on the worker thread with a request to process. * Only one Intent is processed at a time, but the processing happens on a * worker thread that runs independently from other application logic. * So, if this code takes a long time, it will hold up other requests to * the same IntentService, but it will not hold up anything else. * When all requests have been handled, the IntentService stops itself, * so you should not call {@link #stopSelf}. * * @param intent The value passed to {@link * android.content.Context#startService(Intent)}. * This may be null if the service is being restarted after * its process has gone away; see * {@link android.app.Service#onStartCommand} * for details. */ @WorkerThread protected abstract void onHandleIntent(@Nullable Intent intent);}

 

更多相关文章

  1. SpringBoot 2.0 中 HikariCP 数据库连接池原理解析
  2. Android中常用的设计模式(一)
  3. Android面试题集锦之Service生命周期
  4. Android消息机制(三):Looper
  5. Android(安卓)Fragment---与Activity生命周期的协调
  6. 你真的懂了Android的生命周期了吗,带你重新走一遍过程
  7. android解析JSON字符串 (最强最简便方法)
  8. [置顶] Android百度地图SDK 导航SDK2.0结合定位SDK6.0.5的导航参
  9. Android的键盘事件处理

随机推荐

  1. 【Android】通过软引用实现图片缓存,防止
  2. Android 神兵利器Dagger2使用详解(三)MVP架
  3. android中shape
  4. Android RadioGroup和RadioButton使用
  5. 【Android Training视频系列】第4讲Build
  6. Android所有系统资源图标android.R.drawa
  7. Intent实现Android间的页面跳转
  8. android 开发BUG
  9. Android中事件分发机制分析
  10. Android下基于XML的Graphics shape使用方