anroid-理解IntentService方式开启一个服务

从网上摘录了对IntentService总结较完整的结论:

IntentService特征

  • 1、会创建独立的worker线程来处理所有的Intent请求;
  • 2、会创建独立的worker线程来处理onHandleIntent()方法实现的代码,无需处理多线程问题;

    3、所有请求处理完成后,IntentService会自动停止,无需调用stopSelf()方法停止Service;

    4、为Service的onBind()提供默认实现,返回null;

  • 5、为Service的onStartCommand提供默认实现,将请求Intent添加到队列中;

下面,我将要结合源代码对以上5个特点进行阐述:

  • 1、会创建独立的worker线
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);
}

在之前,我们先看一下HanderThread到底是什么?

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

从上面的定义,我们可以看出,ServiceHandler是一个私有的内部类,而且是继承了Handler,正是因为它继承了Handler,才有了我们所说的,它可以创建独立的worker线程,实际上的worker线程就是这个继承了Handler的内部类线程。并且在onCreate方法中对其进行了初始化。

during processing, and to have a static startService(Context, Intent) method that would launch the service & hand off a wakelock.

在onCreate方法中,有如上的注释,结合刚才的解释,大概的意思是说,只要你调用了startService方法,就可以开启一个服务,并且该服务会创建一个独立的线程,具体干什么?下面将逐步进行说明。

2、会创建独立的worker线程来处理onHandleIntent()方法实现的代码,无需处理多线程问题

我们还是从service的生命周期回调函数来深入展开分析。

下一步,将进入onStartCommand周期函数中。首先开一下代码实现:

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

在此会调用onStart方法:

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

在onStart方法中,我们很清楚的发现,实际上,执行过该方法之后,所产生的效果是,调用时所传入的Intent,通过消息队列,传入到了ServiceHandler类中的 handleMessage(Message message)中

@Override
public void handleMessage(Message msg) {
    onHandleIntent((Intent)msg.obj);
    stopSelf(msg.arg1);
}

通过该方法的实现,我们可以看出,其会执行onHandleIntent方法,其方法是一个抽象方法,需要用户去实现,所以,用户在使用该模式创建一个Service时,必须要重写onHandleIntent方法。当该方法执行结束会,调用了stopSelf()方法,其会传入的服务的ID,来自动的关闭该服务,所以,不需要用户去手动的关闭一个服务,只要onHandleIntent方法执行结束,就会自动调用停止该服务。

  • 3、所有请求处理完成后,IntentService会自动停止,无需调用stopSelf()方法停止Service;
  • 2中已做解释

    4、为Service的onBind()提供默认实现,返回null;

  • public IBinder onBind(Intent intent) {
        return null;
    }
  • 5、为Service的onStartCommand提供默认实现,将请求Intent添加到队列中;

2中已做解释

时间: 2024-10-09 06:57:23

anroid-理解IntentService方式开启一个服务的相关文章

判断一个服务是否开启

判断一个服务是否处于运行状态, 很好用的方法, 需要知道Service的完整名称. 1 public static boolean isServiceRunning(Context context, String serviceName) { 2 // 得到一个应用管理器, 如同windows中的任务管理器一样 3 ActivityManager am = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);

Android四大组件——Service后台服务、前台服务、IntentService、跨进程服务、无障碍服务、系统服务

Service后台服务.前台服务.IntentService.跨进程服务.无障碍服务.系统服务 本篇文章包括以下内容: 前言 Service的简介 后台服务 不可交互的后台服务 可交互的后台服务 混合性交互的后台服务 前台服务 IntentService AIDL跨进程服务 AccessibilityService无障碍服务 系统服务 部分源码下载 前言 作为四大组件之一的Service类,是面试和笔试的必备关卡,我把我所学到的东西总结了一遍,相信你看了之后你会对Service娓娓道来,在以后遇

通过代码的方式完成WCF服务的寄宿工作

使用纯代码的方式进行服务寄宿 服务寄宿的目的是为了开启一个进程,为WCF服务提供一个运行的环境.通过为服务添加一个或者多个终结点,使之暴露给潜在的服务消费,服务消费者通过匹配的终结点对该服务进行调用,除去上面的两种寄宿方式,还可以以纯代码的方式实现服务的寄宿工作. 新建立一个控制台应用程序,添加System.ServiceModel库文件的引用. 添加WCF服务接口:ISchool使用ServiceContract进行接口约束,OperationContract进行行为约束 1 using Sy

Starting an Activity 开启一个活动

Starting an Activity 开启一个活动 Previous NextGet  started This lesson teaches you to 这个课程教你去了解以下: Understand the Lifecycle Callbacks       理解生命周期回调 Specify Your App's Launcher Activity     指定应用程序的启动活动 Create a New Instance                           创建一个新

WCF入门教程(四)通过Host代码方式来承载服务

WCF入门教程(四)通过Host代码方式来承载服务 之前已经讲过WCF对外发布服务的具体方式. WCF入门教程(一)简介 Host承载,可以是web,也可以是控制台程序等等.比WebService有更大的使用空间.具体承载的简单框图如下: 通过服务终结点,然后通过Host承载这些终结点,这样客户端就可以访问这些服务了. 一个服务可以添加多个终结点,终结点中定义了Address,Binding和Contract. 而且还可以针对终结点定义一定的行为. 下面给出简单实例,通过ServiceHost来

mysql登录及开启mysql服务

一.mysql登录 没有 mysql.sock     mysql -u root -h 192.168.0.1 -p 二.开启mysql 服务 1.mysqld守护进程启动 mysqld是mysql的守护进程,这种方式启动的时候会读取my.cnf文件中的[mysqld]和[server]组中的配置参数.一般的,我们通过这种方式手动的调用mysqld,如果不是出去调试的目的,我们一般都不这样做.这种方式如果启动失败的话,错误信息只会从终端输出,而不是记录在错误日志文件中,这样,如果mysql崩溃

AIX6开启NFS服务

AIX6开启NFS服务 NFS协议是stateless的.服务端是没有跟踪记录客户端对目录操作的状态,服务端只是记录有哪些客户机在操作.要求客户端是主动和智能的,即由客户端提出对服务端的共享文件的mount方式,比如,服务端宕机,客户机如何处理等. NFS服务端需要的守候进程(daemon) : portmap(端口映射器,记录nfs所用端口,实现访问) nfsd(主进程) rpc.mountd rpc.statd rpc.lockd NFS客户端需要的守候进程(daemon) : portma

我所理解的SOA和微服务

SOA和微服务到底是什么关系? 说实话,我确实不明白SOA和微服务到底有什么本质上的区别,两者说到底都是对外提供接口的一种架构设计方式.我倒觉得微服务其实就是随着互联网的发展,复杂的平台.业务的出现,导致SOA架构向更细粒度.更通过化程度发展,就成了所谓的微服务了.以这种说法做为根据,我觉得SOA与微服务的区别在于如下几个方面: 微服务相比于SOA更加精细,微服务更多的以独立的进程的方式存在,互相之间并无影响: 微服务提供的接口方式更加通用化,例如HTTP RESTful方式,各种终端都可以调用

烂泥:ESXI开启SNMP服务

本文首发于烂泥行天下. 要监控ESXI,打算通过snmp方式进行监控,这样操作比较简单.但是要使用SNMP方式进行监控,必须要开启ESXI的SNMP服务.ESXI由于版本号的不同,SNMP开启的方法也不尽相同. 我们先来介绍ESXI5.0开启方法.在开启之前,我们先使用ESXI提供的工具进行检测.这个检测工具是VMware vSphere CLI,这个工具是需要单独下载并安装的. 在此我已经下载并安装VMware vSphere CLI工具,我们主要是使用该工具提供的一个vicfg-snmp.p