欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

android IntentService实现原理及内部代码分享

程序员文章站 2023-11-12 10:08:46
    很多网友可能发现android中除了service还有一个intentservice,他们之间到底有哪些区别呢? 在继承关系上而言in...
    很多网友可能发现android中除了service还有一个intentservice,他们之间到底有哪些区别呢? 在继承关系上而言intentservice是service的子类,内部实现的代码中涉及到一些android入门开发者不了解的looper,android123在早期的文章中已经说明他们的用法,这里不再赘述,有关原理大家可以看源码实现如下:
   
复制代码 代码如下:

public abstract class intentservice extends service {
    private volatile looper mservicelooper;
    private volatile servicehandler mservicehandler; //一个handler封装了looper对象
    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);
        }
    }
    public intentservice(string name) { //构造方法,需要提供一个name作为标识
        super();
        mname = name;
    }

  对于下面的setintentredelivery的参数,如果为真时
复制代码 代码如下:

onstartcommand(intent, int, int)} will return
service#start_redeliver_intent}, so if this process dies before
onhandleintent(intent)} returns, the process will be restarted

如果为假时
复制代码 代码如下:

onstartcommand(intent, int, int)} will return
service#start_not_sticky}, and if the process dies
     public void setintentredelivery(boolean enabled) {
        mredelivery = enabled;
    }
    @override
    public void oncreate() { //这里重写父类service的创建,主要是构造一个线程
        super.oncreate();
        handlerthread thread = new handlerthread("intentservice[" + mname + "]");
        thread.start();
        mservicelooper = thread.getlooper();
        mservicehandler = new servicehandler(mservicelooper);
    }
    @override
    public void onstart(intent intent, int startid) {  //android 2.0以前的service启动参数控制
        message msg = mservicehandler.obtainmessage();
        msg.arg1 = startid;
        msg.obj = intent;
        mservicehandler.sendmessage(msg);
    }
    @override
    public int onstartcommand(intent intent, int flags, int startid) { //android 2.0以后的服务启动参数
        onstart(intent, startid);
        return mredelivery ? start_redeliver_intent : start_not_sticky;
    }
    @override
    public void ondestroy() { //服务摧毁的时候looper一定要释放掉,这点很重要。
        mservicelooper.quit();
    }
    @override
    public ibinder onbind(intent intent) {
        return null;
    }
    protected abstract void onhandleintent(intent intent);
}

 从上面的代码相信大家可以看出intentservice和service的不同了,通过looper和thread来解决标准service中处理逻辑的阻塞问题,毕竟android的service也是会阻塞的。