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

Android:IntentService详情

程序员文章站 2022-05-14 08:32:50
借鉴自开发艺术 构造方法中必须调用父类的有参构造 intentservice是一个抽象类 适合,需要高优先级的,短期的,后台耗时任务,执行完后会自动停止。 封装了handlerthread和hand...

借鉴自开发艺术

构造方法中必须调用父类的有参构造

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。