`
ice.k
  • 浏览: 286627 次
  • 性别: Icon_minigender_1
  • 来自: 荷兰
社区版块
存档分类
最新评论

Android IntentService 深入分析

阅读更多
Android IntentService
什么是IntentService?
官方的解释是:
IntentService is a base class for Services that handle asynchronous requests (expressed as Intents) on demand. Clients send requests through android.content.Context.startService(Intent) calls; the service is started as needed, handles each Intent in turn using a worker thread, and stops itself when it runs out of work.

This "work queue processor" pattern is commonly used to offload tasks from an application's main thread. The IntentService class exists to simplify this pattern and take care of the mechanics. To use it, extend IntentService and implement onHandleIntent(Intent). IntentService will receive the Intents, launch a worker thread, and stop the service as appropriate.

All requests are handled on a single worker thread -- they may take as long as necessary (and will not block the application's main loop), but only one request will be processed at a time.


意思是说:IntentService是一个通过Context.startService(Intent)启动可以处理
异步请求的Service,使用时你只需要继承IntentService和重写其中的
onHandleIntent(Intent)方法接收一个Intent对象,在适当的时候会停止自
己(一般在工作完成的时候). 所有的请求的处理都在一个工作线程中完成,他
们会交替执行(但不会阻塞主线程的执行),一个请求会在第一时间执行.

下面是要分析的源码:
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);
        }
    }
从源码可以分析出:
IntentService 实际上是Looper,Handler,Service 的集合体,他不仅有服
务的功能,还有处理和循环消息的功能.

下面是onCreate()的源码:
    @Override
    public void onCreate() {
        super.onCreate();
        HandlerThread thread = new HandlerThread("IntentService[" + mName + "]");
        thread.start();

        mServiceLooper = thread.getLooper();
        mServiceHandler = new ServiceHandler(mServiceLooper);
    }
分析:IntentService创建时就会创建Handler线程(HandlerThread)并且启
动,然后再得到当前线程的Looper对象来初始化IntentService的
mServiceLooper,接着创建mServicehandler对象.

下面是onStart()的源码:
@Override
    public void onStart(Intent intent, int startId) {
        Message msg = mServiceHandler.obtainMessage();
        msg.arg1 = startId;
        msg.obj = intent;
        mServiceHandler.sendMessage(msg);
    }
分析:当你启动IntentService的时候,就会产生一条附带startId和Intent
的Message并发送到MessageQueue中,接下来Looper发现MessageQueue中
有Message的时候,就会停止Handler处理消息,接下来处理的代码如下:
@Override
        public void handleMessage(Message msg) {
            onHandleIntent((Intent)msg.obj);
            stopSelf(msg.arg1);
        }
接着调用 onHandleIntent((Intent)msg.obj),这是一个抽象的方法,其实
就是我们要重写实现的方法,我们可以在这个方法里面处理我们的工作.当任务
完成时就会调用stopSelf(msg.arg1)这个方法来结束指定的工作.

当所有的工作执行完后:
就会执行onDestroy方法,源码如下:

    @Override
    public void onDestroy() {
        mServiceLooper.quit();
    }

服务结束后调用这个方法 mServiceLooper.quit()使looper停下来.

通过对源码的分析得出:
这是一个基于消息的服务,每次启动该服务并不是马上处理你的工作,
而是首先会创建对应的Looper,Handler并且在
MessageQueue中添加的附带客户Intent的Message对象,当Looper发现有
Message的时候接着得到Intent对象通过在
onHandleIntent((Intent)msg.obj)中调用你的处理程序.处理完后即会停止
自己的服务.意思是Intent的生命周期跟你的处理的任务是一致的.所以这个类
用下载任务中非常好,下载任务结束后服务自身就会结束退出.
分享到:
评论

相关推荐

    IntentService简单应用

    本篇文章将深入探讨IntentService的原理、使用方法以及其在实际开发中的优势。 IntentService的核心特性在于它的异步处理能力。当启动IntentService时,系统会创建一个新的工作线程,所有的Intent都会在这个线程中...

    android 中的服务Service intentService例子

    - **源码**:理解Service和IntentService的工作原理,需要阅读和分析Android系统的源代码,以便深入学习其内部机制。 - **工具**:开发过程中,可以利用Android Studio等IDE工具,以及调试工具进行服务的开发和测试...

    Android主要机制深入分析

    这篇深入分析文档将带你探索Android的核心组件和工作原理,从而提升你的Android开发技能。 1. **进程与线程管理**: - **主进程**: 应用程序的主要执行环境,负责承载Activity、Service等组件。 - **Worker进程**...

    Android开发深入浅出

    此外,书中还涵盖了Android的多线程和异步处理,讲解了Handler、Looper、AsyncTask以及IntentService的工作原理,帮助开发者解决性能优化和用户体验提升的问题。对于Android的性能优化,会涉及内存管理、CPU使用率...

    Android Studio实例代码.zip_Android app实例_Android实例_android app源码_and

    本压缩包“Android Studio实例代码.zip”包含了多个Android app的实例源码,旨在帮助开发者深入理解并实践Android应用开发。 1. **Android Studio基础** Android Studio基于IntelliJ IDEA,提供了强大的代码编辑、...

    Android高级应用源码-Android 音乐频谱分析,把时域上连续的信号(波形)强度转换成离散的频域信号(频谱)。.zip

    本项目提供的"Android高级应用源码-Android 音乐频谱分析,把时域上连续的信号(波形)强度转换成离散的频域信号(频谱)",将帮助开发者深入理解这一过程。 首先,音乐频谱分析的核心是傅里叶变换。傅里叶变换是一种...

    Android Service深入解析Demo

    这篇博客"Android Service深入解析Demo"通过实例深入讲解了Service的相关知识,下面将详细阐述Service的核心概念、生命周期、启动与绑定方式以及如何在实践中应用。 1. **Service核心概念** Service是Android系统...

    Android程序研发源码Android 电影简介分析源码.zip

    让我们深入探讨一下这个项目可能包含的知识点以及在Android开发中的相关技术。 首先,这个应用的核心功能很可能是通过网络接口获取电影信息,这涉及到网络编程。在Android中,通常使用HttpURLConnection或OkHttp库...

    《Android Studio实战 快速 高效地构建Android应用》pdf 高清扫描版

    《Android Studio实战:快速高效地构建Android应用》是一本针对Android开发者的重要参考资料,它深入浅出地介绍了如何利用Android Studio这一强大的集成开发环境(IDE)来高效地构建Android应用程序。这本书的内容...

    50款Android studio项目源码.zip

    本文将深入探讨"50款Android studio项目源码.zip"这一资源包,为初学者提供一个全面的学习路径,帮助他们快速掌握Android应用开发的核心技能。 首先,我们要理解Android Studio的优势。它基于IntelliJ IDEA,提供了...

    DDZ.rar_android_android 斗地主_斗地主 android

    【标题】"DDZ.rar_android_android 斗地主_斗地主 android" 是一个与Android平台...通过分析这个项目,开发者不仅可以学习到Android应用开发的基本流程,还能深入了解游戏开发中的各种技术和实践,提升自己的编程能力。

    mars Android第五季视频源码全

    6. **Android组件**:可能深入分析了BroadcastReceiver、Service和IntentService的工作原理及其应用。 7. **Android权限管理**:包括运行时权限的处理,以及如何适配Android的不同版本。 8. **Android架构设计**:...

    Android群英传+Android群英传-神兵利器(带书签版本)

    12. **Android性能优化**:优化是提高用户体验的关键,书中可能涉及到内存泄漏检测、耗电分析、渲染性能优化等实用技巧。 13. **Android最新特性**:随着Android系统的不断迭代,新的API和特性层出不穷。书中可能会...

    Android 电影简介分析源码.rar

    在Android平台上进行电影简介分析,通常涉及到数据抓取、数据解析、UI设计和数据库操作等多个环节。这个"Android 电影简介分析源码"项目可能是...通过分析源码,开发者可以深入理解Android应用的开发流程和最佳实践。

    Android简易本地音乐播放器源码,基于Android的简易本地音乐播放器源码

    在Android平台上,开发一个简易本地音乐播放器是一项常见的任务,对于初学者来说...通过分析和学习这个源码,开发者可以深入了解Android音频播放、UI设计以及应用架构等方面的知识,对提升Android开发技能非常有帮助。

    Android大作业.zip

    通过阅读和分析这些代码,你可以更深入地学习和理解Android图形编程和网络通信的实现细节。而"移动终端大作业报告.doc"很可能是对这两个项目的技术文档,包括设计思路、实现方法以及可能遇到的问题和解决方案。

    Android开发艺术探索.任玉刚(带详细书签).pdf

    第7章 Android动画深入分析 265 7.1 View动画 265 7.1.1 View动画的种类 265 7.1.2 自定义View动画 270 7.1.3 帧动画 272 7.2 View动画的特殊使用场景 273 7.2.1 LayoutAnimation 273 7.2.2 Activity的切换...

    android中的Email源码

    通过研究Android Email的源码,开发者可以深入了解Android的系统服务、数据存储、网络通信等方面的知识,有助于进行邮件应用的二次开发或自定义功能的实现。同时,这也是提升Android开发技能的一个宝贵资源。

    Android 基础教程 第三版 PDF 含源码

    书中深入探讨了Android应用程序的四大组件:活动(Activity)、服务(Service)、广播接收器(Broadcast Receiver)和内容提供者(Content Provider)。活动是用户界面的核心,服务则在后台运行,不与用户交互。广播...

Global site tag (gtag.js) - Google Analytics