Android Service总结02 service介绍

版本

版本说明

发布时间

发布人

V1.0

介绍了Service的种类,常用API,生命周期等内容。

2013-03-16

Skywang


概要

若读者之前没接触过service,对下面内容有个大致了解即可。待使用过service之后再来阅读本章内容,会理解更深刻。

service是Android四大组件之一,其余的是activity、BroadcastReceiver、Content Provider。service是一个能够在后台执行长时操作的应用程序组件,它不提供用户界面。应用程序能够通过service来启动后台操作,不同应用程序也能够通过service来实现进程间通信(IPC)。

一个service被启动后,实际上还是运行在主线程中,即UI线程。若用户要执行比较耗时的操作,建议新建一个线程来处理;否则可以到UI线程阻塞,影响用户体验。


1 service种类和区别

这里介绍的android服务有4种,下面分别说明。

1.1 Started Service

即,被启动的服务,它是2种常见服务之一,另一种是Bound Service。它常被用在执行进程的某个后台操作,如通过该服务来实现文件下载等功能。
  要提供被启动的服务:首先,要创建一个继承于Service的类。然后,其它的应用程序可以通过startService()来启动该服务;若要停止服务,可以在应用程序中执行stopService(),也可以在服务中执行stopSelf()来停止服务。

当服务一旦启动,它就能够无限期的在后台运行,即使启动它的组件被销毁。通常,一个被启动的服务执行一个单一操作,并且不给调用者返回结果。若需要返回结果,可以通过广播(BroadcastReceiver)来实现。这些在“Android Service总结03 之被启动的服务 -- Started Service”中以详细示例来说明。

1.2 Bound Service

即,被绑定的服务,和Started Service一样,它也是2种常见服务之一。它也常被用在执行进程的某个后台操作,如通过该服务来实现文件下载等功能。
  要提供被绑定的服务:首先,要创建一个继承于Service的类。然后,其它的应用程序可以通过bindService()来绑定该服务,绑定服务后,就可以调用服务提供的功能;若要解除服务,可以在应用程序中执行unbindService()。

“Started Service”和“Bound Service”的主要区别:

(01) 启动/停止方式不同

  • 若要启动“Started Service”,需要调用startService();要停止该服务,要调用stopService()或stopSelf()。
  • 若要绑定“Bound Service”,则调用bindService();若要解除绑定,则要调用unbindService()。

(02) 实现接口不同

  • “Started Service”中,一般要实现service的onStartCommand()接口。因为startService()会调用onStartCommand()接口,我们一般在onStartCommand()中执行一些服务提供的功能,若启动一个线程用于下载。
  • “Bound Service”中,一般要实现service的onBind()接口。  onBind()函数要返回一个IBinder对象,客户端调用bindService()绑定该服务时被调用。这个绑定是异步的,bindService()方法会立即返回,并且不给客户端返回IBinder对象。要接收IBinder对象,客户端必须创建一个实现ServiceConnection类,并创建ServiceConnection的实例;然后在,bindService()方法中调用ServiceConnection的实例。这里只需要有个大致概念即可;后面在“Android Service总结04 之被绑定的服务 -- Bound Service”中,我们会详细介绍各个接口的作用,以及如何实现这些接口。

(03) 活跃生命周期不同

这里“活跃生命周期”(active lifetime)不同于“完整生命周期”(entire lifetime)。它们的完整生命周期都是起始于onCreat(),结束于onDestroy()。但“活跃生命周期”指的是服务仍然是活动状态。

  • “Started Service”的活跃生命周期开始于startService(),停止于stopService()或stopSelf()。一个“Started Service”可以被多次启动,每次启动都会调用service的onStartCommand()接口;但是,一旦stopService()或stopSelf()被调用,它的活跃生命周期即结束!
  • “Bound Service”的活跃生命周期开始于bindService(),停止于最后一个客户端调用unbindService()。意思是,“Bound Service”可以被多个客户端绑定,即多个客户端可以调用bindService()来绑定相同的服务。当第一个绑定服务的客户端调用bindService()时,“Bound Service”的活跃生命周期即开始了;当所有的客户端全部解除绑定时,它的活跃生命周期即结束了。

  补充:一个service可以同时提供“Started Service”和“Bound Service”。要能提供开始的服务,需实现onStartCommand()接口;要能提供绑定的服务,需实现onBind()。同时实现两种接口,即能提供两种服务。

1.3 IntentService

它的特性是对服务的请求逐个处理,而不能同时处理多个请求。
  要提供IntentService:首先,要创建一个继承于Service的类。然后,其它的应用程序可以通过startService()来启动该服务;若要停止服务,可以在应用程序中执行stopService(),也可以在服务中执行stopSelf()来停止服务,另外,IntentService中的请求被处理完毕,它也会自动停止。

由于“IntentService”和“Started Service”的启动和停止方式一致,我们这里介绍一下它们的主要区别:
(01) 实现原理不同

  • IntentService内部有一个工作队列,逐个对任务进行处理。因为不必担心多线程的问题。
  • “Started Service”支持单线程或多线程,但必须我们自己在服务中实现。

(02) 实现的API不同

  • IntentService必须实现onHandleIntent()接口,在onHandlerIntent()中启动IntentService的Intent进行处理。
  • “Started Service”要实现onStartCommand()接口,服务所需提供的功能,一般在该接口中处理。

(03) 生命周期不同。

  • IntentService中所有的启动请求都被处理之后会自动终止这个服务,因此你不需要自己去调用stopSelf()方法。
  • “Started Service”的生命周期开始于startService(),停止于stopService()或stopSelf()。

1.4 AIDL

AIDL(Android Interface Definition Language),是用来来完成进程间通信(IPC)。
  一般在服务需要接受不同应用多线程的请求时才需要使用AIDL;如果是同一个应用内的请求使用Binder实现即可;如果只是应用间通信而不是多线程处理的话使用Messenger,当然这两种情况也可以使用AIDL。本地进程和远程进程使用AIDL有所不同,本地进程内调用时会都在调用的线程内执行,远程进程使用是通过Service进程内一个由系统维护的线程池发出调用,所以可能是未知线程同时调用,需要注意线程安全问题。


2 服务的API

无论是“Started Service”还是“Bound Service”,它们都是继承与Service类。下面对Service类中的主要API进行简要说明。

onStartCommand():当其它程序调用startService()时,系统会自动调用该函数。且一旦执行了该函数,服务就被启动了。此时,启动的服务是“Started Service”。

onBind():当其它程序调用bindService()时,系统会自动调用该函数。一旦执行了该函数,服务就被启动了。此时,启动的服务是“Bounder Service”。若要提供绑定功能,则必须实现该函数,并且要返回IBinder对象;若不想提供绑定功能,则可以直接返回null。

onUnbind():当其它程序调用unbindService(),系统会自动调用该函数。

onCreate():服务被创建时,系统会自动调用该函数。一般在该函数中进行初始化工作,例如:新建线程。

onDestroy():在服务被销毁时,系统会自动调用该函数。一般在该函数中进行清除工作,例如,终止并回收线程。


3 服务声明方法

在manifest中,通过以下方法声明服务

<manifest ... >
...
<application ... >
<service android:name=".ExampleService" />
...
</application>
</manifest>

像activity一样。你即可以在service对应的manifest中注册intent-filter,让其它程序通过隐式意图来调用该服务;也可以不注册intent-filter,直接通过显式意图来调用该服务。若想让某服务成为某application的私有服务,则可以通过设置android:exported属性为false。


4 服务的生命周期

service 的生命周期时序图如下:

更多service内容:

Android Service总结01 目录

Android Service总结02 service介绍

Android Service总结03 之被启动的服务 -- Started Service

Android Service总结04 之被绑定的服务 -- Bound Service

Android Service总结05 之IntentService

Android Service总结06 之AIDL


Android Service总结02 service介绍的更多相关文章

  1. Android四大组件之一Service介绍-android学习之旅(十二)

    基本概念: service是android四大组件之一,运行在后台执行耗时操作,并不提供用户界面.其他组件如acticity可以通过startService启动该组件,也可以通过bindService ...

  2. Android开发6:Service的使用(简单音乐播放器的实现)

    前言 啦啦啦~各位好久不见啦~博主最近比较忙,而且最近一次实验也是刚刚结束~ 好了不废话了,直接进入我们这次的内容~ 在这篇博文里我们将学习Service(服务)的相关知识,学会使用 Service ...

  3. Android四大组件之Service

    Android四大组件之Service Android支持服务的概念,服务是在后台运行的组件,没有用户界面,Android服务可用有与活动独立的生命周期.Android支持两种类型的服务: 本地服务: ...

  4. Android中Activity、Service和线程之间的通信

    Activity.Service和线程应该是Android编程中最常见的几种类了,几乎大多数应用程序都会涉及到这几个类的编程,自然而然的,也就会涉及到三者之间的相互通信,本文就试图简单地介绍一下这三者 ...

  5. Android笔记二十七.Service组件入门(一).什么是Service?

    转载请表明出处:http://blog.csdn.net/u012637501(嵌入式_小J的天空) 一.Service 1.Service简单介绍     Service为Android四大组件之中 ...

  6. Android四大组件之一 -- Service详解

    相信大多数朋友对Service这个名词都不会陌生,没错,一个老练的Android程序员如果连Service都没听说过的话,那确实也太逊了.Service作为Android四大组件之一,在每一个应用程序 ...

  7. 如何快速学会android的四大基础----Service篇

    很多人都以为,只要学过一点java就可以马上写android应用了,这种想法的产生非常自然,因为现在网上有那么多的android开源实例,只要跟着来,也能够自己写一个播放器.但是,只有去写一个真正投入 ...

  8. Android 四大组件之 Service(二)

    这里主要介绍Service组件的使用. 1.定义一个继承Service的子类 如下: package com.service; import android.app.Service; import a ...

  9. Android四大组件之Service(续)

    本地服务启动和通过广播的方式回调是非常简单的. 下面介绍远程服务和通过远程回调的方式通知activity的方式. 1.service定义: package com.joyfulmath.globals ...

随机推荐

  1. Phantomjs 抓取、分析某个页面加载时浏览器发起的所有的子请求

    var page = require('webpage').create(), system = require('system'), address; if (system.args.length ...

  2. ASP.NET Web配置使用HTTPS实用案例

    Step by Step 配置使用HTTPS的ASP.NET Web应用 有关HTTPS.SSL以及SSL证书的工作原理,参见 <HTTPS那些事(一)HTTPS原理> <HTTPS ...

  3. wpf 查找children的方法

    var newValue = (bool)args.NewValue; HZWaitLoadingEx source = (HZWaitLoadingEx)sender; ControlTemplat ...

  4. Hitcon 2016 Pwn赛题学习

    PS:这是我很久以前写的,大概是去年刚结束Hitcon2016时写的.写完之后就丢在硬盘里没管了,最近翻出来才想起来写过这个,索性发出来 0x0 前言 Hitcon个人感觉是高质量的比赛,相比国内的C ...

  5. hdu 1698 线段树(成段替换 区间求和)

    一条钩子由许多小钩子组成 更新一段小钩子 变成铜银金 价值分别变成1 2 3 输出最后的总价值 Sample Input11021 5 25 9 3 Sample OutputCase 1: The ...

  6. 【LOJ】#2098. 「CQOI2015」多项式

    题解 令x = x - t代换一下会发现 \(\sum_{i = 0}^{n}a_i (x + t)^i = \sum_{i = 0}^{n} b_{i} x^{i}\) 剩下的就需要写高精度爆算了- ...

  7. Python join() 方法与os.path.join()的区别

    Python join() 方法与os.path.join()的区别 pythonJoinos.path.join 今天工作中用到python的join方法,有点分不太清楚join() 方法与os.p ...

  8. 循序渐进学.Net Core Web Api开发系列【10】:使用日志

    系列目录 循序渐进学.Net Core Web Api开发系列目录 本系列涉及到的源码下载地址:https://github.com/seabluescn/Blog_WebApi 一.本篇概述 本篇介 ...

  9. 21.python中的闭包和装饰器

    python中的闭包从表现形式上定义(解释)为:如果在一个内部函数里,对在外部作用域(但不是在全局作用域)的变量进行引用,那么内部函数就被认为是闭包(closure). 以下说明主要针对 python ...

  10. 8.4 正睿暑期集训营 Day1

    目录 2018.8.4 正睿暑期集训营 Day1 A 数对子 B 逆序对 C 盖房子 考试代码 A B C 2018.8.4 正睿暑期集训营 Day1 时间:4.5h(实际) 期望得分:30+50+3 ...