码迷,mamicode.com
首页 > 移动开发 > 详细

Android IntentService

时间:2017-12-14 21:00:49      阅读:170      评论:0      收藏:0      [点我收藏+]

标签:obj   处理   code   live   pre   而不是   androi   fine   over   

概述

IntentService继承了Service并且是一个抽象类,使用它必须创建它的子类。IntentService可执行后台耗时的任务,当任务结束时它会自动停止。由于IntentService是一种服务,所以它的优先级会比普通线程的高,适合执行一些高优先级的后台任务,因为高优先级不容易被系统杀死。

工作原理

IntentService封装了HandlerThread和Handler,在onCreate方法中创建HandlerThread和Handler,并把handler和HandlerThread的Looper关联起来

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

        mServiceLooper = thread.getLooper();
        mServiceHandler = new ServiceHandler(mServiceLooper);
    }

每一次启动IntentService,onStartCommand方法会被调用,处理每个后台任务的Intent.

    public int onStartCommand(Intent intent, int flags, int startId) {
        onStart(intent, startId);
        return mRedelivery ? START_REDELIVER_INTENT : START_NOT_STICKY;
    }

上面代码可以知道,onStartCommand又调用了onStart(intent, startId)

    public void onStart(Intent intent, int startId) {
        Message msg = mServiceHandler.obtainMessage();
        msg.arg1 = startId;
        msg.obj = intent;
        mServiceHandler.sendMessage(msg);
    }

onStart方法通过mServiceHandler把Intent对象发送出去,这个Intent对象跟外界的startService(intent)中的intent是一致的

我们看看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);
        }
    }

handleMessage方法调用了onHandleIntent((Intent)msg.obj)。onHandleIntent是个抽象方法,我们需要在IntentService的子类重写它,所以在这里我们可以进行耗时任务的执行。通过不同的intent参数,我们就可以进行不同的后台任务处理了。onHandleIntent方法执行完毕后调用stopSelf(int startId)自动停止任务,之所以调用stopSelf(int startId)而不是stopSelf(),是因为stopSelf()会马上停止任务,但这时可能会有其他任务还没处理,stopSelf(int startId)会等待所有任务处理之后再停止任务。
由于IntentService内部是通过handler的形式发送消息处理任务的,Looepr是按顺序处理消息的,所以IntentService也是按启动顺序执行后台任务。

通过以上的分析,我们知道IntentService的使用重点在于重写onHandleIntent方法,对不同的intent对象进行不同的处理,启动IntentService时对intent传入参数,通过这些参数作为标识就可以进行不同任务的处理

Android IntentService

标签:obj   处理   code   live   pre   而不是   androi   fine   over   

原文地址:http://www.cnblogs.com/linghu-java/p/8039577.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!