博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
IntentService
阅读量:6860 次
发布时间:2019-06-26

本文共 2097 字,大约阅读时间需要 6 分钟。

hot3.png

        IntentService是一种用于处理异步请求(表现为Intent)的服务基类。客户通过调用Context.startService(Intent)发送请求;根据需要启动服务,依次使用工作者线程处理每一个Intent,并且在工作完成后终止自身。

        这种“工作队列处理器”模式通常被用来从一个应用程序的主线程卸载任务。IntentService类的存在是为了简化这种模式,并且照顾了技术性的部分。要使用它,需要继承IntentService类并且实现onHandleIntent(Intent)方法。IntentService将会接收到这些Intent,运行一条工作者线程,并且在适当的时候停止服务。

     所有的请求都是在一个单一的工作者线程中处理的,尽管处理过程可能需要很长时间(不会阻塞应用程序的主线程),但是每次只能有一个请求会被处理。

    首先,看它提供的一个构造方法:

public IntentService(String name) {    super();    mName = name;}

        参数name被用于命名即将用到的工作者线程,它的重要性仅用于调试。这里需要注意的一点是,Service的实例化是系统来完成的,并且系统是用无参的构造方法来实例化Service的。所以,你的子类必须是无参的,然后在无参构造方法里调用super("name")。

        再看onCreate方法:

    @Override    public void onCreate() {        super.onCreate();        HandlerThread thread = new HandlerThread("IntentService[" + mName + "]");        thread.start();        mServiceLooper = thread.getLooper();        mServiceHandler = new ServiceHandler(mServiceLooper);    }

        其中的ServiceHandler是IntentService类的内部类:

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

       在onCreate方法里,创建并启动了一条工作线程。然后使用工作线程的Looper构造了一个Handler,这个Handler将循环处理请求。

        根据Service的生命周期,我们再看onStartCommand方法:

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

        后面的返回值,可以看看Service类的相关内容。onStartCommand方法调用了onStart方法。再跟到onStart方法:

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

        每次调用Context.startService(Intent intent),都会将一个请求(Message,包含一个Intent,并有一个id)添加到消息队列(工作线程的循环队列,相关内容可以看Handler源码)。处理完所有请求后,就会停止服务。

        对于onHandleIntent(Intent intent)方法,官方注释是这样说的:

        这个方法运行在工作线程,用于处理一个请求。同一时间只有一个Intent被处理,但是处理过程发生在一个独立于其它应用逻辑的工作线程。因此,如果这个代码块要执行很长时间,它将阻塞其它在同一个IntentService上的请求,除此之外,它不会阻塞其它任何东西。

        另外,IntentService实现了一个默认的onBind方法,默认返回null。

转载于:https://my.oschina.net/u/272863/blog/93445

你可能感兴趣的文章
Jeff Bean谈Flink与流式处理的5大新发现
查看>>
Node常用命令备忘
查看>>
阿里云ECS上CentOS系统配置从入门到进门
查看>>
如何使用一条语句执行mkdir和cd命令
查看>>
Android笔记:存储相关,getExternalCacheDir, getExternalFilesDir,getExternalStorageDirectory等
查看>>
LAMP 全功能编译安装 for CentOS6.3笔记
查看>>
Apache - AH01630
查看>>
试着写写Map/Reduce程序
查看>>
一种被忽视的攻击方式-padding oracle
查看>>
硬盘MBR常识和修复MBR的方法解析
查看>>
Lync 客户端功能对比之会议支持
查看>>
初步了解Docker容器(三)
查看>>
部署无需边缘提供外部访问的Lync Server前端
查看>>
安装、部署DPM 2012 R2服务器
查看>>
内核中的UDP socket流程(8)——udp_sendmsg
查看>>
大数据实战之环境搭建(三)
查看>>
Linux架设Jsp环境
查看>>
XenApp_XenDesktop_7.6实战篇之九:SQL Server数据库服务器规划及部署
查看>>
ExtJS样例总结 -1
查看>>
IT-标准化-系列-10.在VPC 2007中快速部署操作系统-下
查看>>