启动方式

  1. startService(Intent) 这种方式启动的Service可以在后台无限期的运行,与启动它的组件没有关系。
  2. bindService 绑定Service。它提供了一种类似C/S结构的接口,允许组件与Service进行交互,发送请求,获取结果,可以实现IPC跨进程操作。一个客户端组件绑定之后,Service开始运行;所有组件解绑之后,Service停止运行。

这两种方式可以同时存在于一个Service中。

服务在其托管进程的主线程中运行,它既 不创建 自己的线程,也 不会 在单独的进程中运行。可以通过Manifest文件对其运行的进程进行配置。

重要的回调方法

OnStartCommand()

startService() 之后调用的方法。一旦执行此方法,服务即会启动并在后台运行。可以使用stopSelf()或者stopService()方法终止Service。

onBind()

bindService()时,系统将调用此方法。此方法实现中必须返回一个IBinder接口的实例,用来给客户端与Service通信。如果不允许绑定,则应该返回null。

onCreate()

首次创建服务的时候调用此方法。如果服务已经运行,那不会调用此方法。

onDestroy()

服务正常销毁的时候调用此方法。

如果将服务绑定到焦点Activity那它不太可能会被终止;如果将服务声明为前台服务,那它几乎不会被终止。

扩展Service

Service

它是所有服务的基类。
onStartCommand()方法返回值必须是以下常量:

  1. START_NOT_STICKY Service在终止之后,不会自动重启。
  2. START_STICKY Service在终止之后,会自动重启。系统会调用Intent为null的onStartCommand来启动服务。如果有排队的Intent等待服务,那么他们会依次调用onStartCommand方法传递进来。
  3. START_REDELIVER_INTENT Service在终止之后,会自动启动。系统使用最后传进来的Intent,重新调用onStartCommand方法启动服务。
    这里的三个返回值只针对startService()启动的Service,对bindService()启动的Service无效。

IntentService

可以使用工作线程逐一处理所有启动请求。不要求服务同时处理多个请求的时候,它是个不错的选择。

扩展它的时候只需要实现onHandleIntent()方法就可以了。

终止Service

调用stopSelf()自行停止运行;另一个组件调用stopService()来停止它。一旦调用stopService(),系统会 尽快 停止它。

可以在stopSelf()的时候加一个Id。这个Id是onStartCommand()的时候传进来的Id。由于startService()可能被调用多次所以这个onStartCommand()传进来的Id有多个。如果stopSelf(Id)并不是当前的Id那什么都不发生。

绑定Service

客户端组件可以通过bindService()与一个服务绑定。要使服务能够绑定,必须重写onbind()方法来返回一个IBinder实例,用于定义与Service通信的接口。bindService()可以拿到该接口,并通过IBinder对象的实例调用服务的方法。如果没有按照startService()启动,并且没有组件绑定到Service,系统就会销毁该Service。

多个客户端可以同时绑定到同一个Service上。完成交互之后,可以调用unbindService()取消绑定。

前台运行服务

前台Service是一种用户可以感知的一种Service。所以,在内存不足的时候,系统也不会销毁它。前台服务必须提供状态栏的通知,状态栏中位于“正在进行”标题的下方。这意味着除非服务停止或者从前台删除,否则不能清除通知。
调用startForeground()即可将服务变为前台服务。它需要两个参数:1. 唯一标识的整数(不能为0) 2. Notification。
调用stopForeground()即可删除前台服务。一个参数: 是否删除标题栏通知。 这个方法是 不会停止服务的

如果一个前台进程自行终止(stopSelf/stopService),那么通知栏中的通知也会被删除。

Service生命周期

  1. 整个生命周期,从onCreate()方法开始,onDestroy()方法结束。onCreate方法做初始化,onDestroy方法销毁资源。
  2. 有效生命周期,从onStartCommand()/onBind()开始。每种方法都需要传递一个Intent参数。

startService()之后的生命周期与整个生命周期一致;bindService()之后剩下的生命周期到onUnbind()方法结束。

Android Service 基础的更多相关文章

  1. Android Service基础

    Service Service 是一个组件,用来执行长时间的后台操作,不提供用户界面. 另一个应用组件可以启动一个Service,它将持续地在后台运行,即便是用户转移到另一个应用它也不会停止. 另外, ...

  2. Android Service基础知识你知道多少?

    Android四大组件-Service 多次调用startService会怎样?会执行多次onCreate吗? StopService在哪里调用?stopSelf在哪调用? 怎样使Service被ki ...

  3. Service基础使用

    Service基础使用 之前的文章一直介绍Activity的使用,很多知识和用法单一的配合Activity使用,这次将总结Android四大组件之二--Service. 本文将要介绍以下内容: Ser ...

  4. Android Service完全解析,关于服务你所需知道的一切(下)

    转载请注册出处:http://blog.csdn.net/guolin_blog/article/details/9797169 在上一篇文章中,我们学习了Android Service相关的许多重要 ...

  5. AndroidApplication Fundamentals(Android应用基础)

    AndroidApplication Fundamentals(Android应用基础) Android应用采用Java编程语言来编写,AndroidSDK工具编译我们的代码,连同任何数据和资源文件一 ...

  6. 【Xamarin开发 Android 系列 7】 Android 结构基础(下)

    原文:[Xamarin开发 Android 系列 7] Android 结构基础(下) *******前期我们不打算进行太深入的东西,省的吓跑刚进门的,感觉门槛高,so,我们一开始就是跑马灯一样,向前 ...

  7. Android Service 详解

    一个Service也是一种应用程序组件,它运行在后台以提供某种服务,通常不具有可见的用户界面.其它的应用程序组件可以启动一个 Service,即使在用户切换到另外一个应用程序后,这个Service还是 ...

  8. android图形基础知识

    Android核心分析(23)-----Andoird GDI之基本原理及其总体框架 2010-06-13 22:49 18223人阅读 评论(18) 收藏 举报 AndroidGDI基本框架 在An ...

  9. 【转】Android Service完全解析,关于服务你所需知道的一切(下) ---- 不错

    原文网址:http://blog.csdn.net/guolin_blog/article/details/9797169 转载请注册出处:http://blog.csdn.net/guolin_bl ...

随机推荐

  1. Pandaboard ES编译bootloader、xloader、内核、以及安卓系统

    Building bootloader and kernel Bootloader Startwith building the bootloader. To learn more about the ...

  2. java Socket实现简单在线聊天(二)

    接<java Socket实现简单在线聊天(一)>,在单客户端连接的基础上,这里第二步需要实现多客户端的连接,也就需要使用到线程.每当有一个新的客户端连接上来,服务端便需要新启动一个线程进 ...

  3. java Socket实现简单在线聊天(一)

    最近的项目有一个在线网页交流的需求,由于很久以前做过的demo已经忘记的差不多了,因此便重新学习一下. 我计划的大致实现步骤分这样几大步: 1.使用awt组件和socket实现简单的单客户端向服务端持 ...

  4. List转换成JSON对象报错(五)

    List转换成JSON对象 1.具体错误如下 Exception in thread "main" java.lang.NoClassDefFoundError: org/apac ...

  5. 【mongodb系统学习之一】mongodb的简单安装

    linux中mongodb的安装(最简单的): 1.下载mongodb安装包,这里用mongodb-linux-x86_64-2.6.9.gz 提供一个下载地址:http://pan.baidu.co ...

  6. PL/SQL集合 ----- varrays

    varrays可以再表,记录,对象定义中使用,类似于C中的数组. 1.定义varrays用作PL/SQL程序构造块. declare type integer_varray ) of integer; ...

  7. TypeError: Error #1009: 无法访问空对象引用的属性或方法

    1.错误描述 TypeError: Error #1009: 无法访问空对象引用的属性或方法. at FirstMap/search_clickHandler()[E:\Flash Builder\M ...

  8. VS2010编译VS2008工程时,LINK : fatal error LNK1123: failure during conversion to COFF: file invalid or corrupt

    1.问题 电脑上同时安装了VS2008,VS2010,使用VS2010编译VS2008建立的工程,或者,VS2010创建新的工程.编译时,出现以下链接错误: LINK : fatal error LN ...

  9. js 数组去重常见的几种方式

    1.利用标记 var arr = [2,6,2,6,4,3,16];// arr = [2,6,4,3,16] function norepeat(arr){ var res = []; for(va ...

  10. 从输入URL到页面加载的过程?如何由一道题完善自己的前端知识体系!

    前言 见解有限,如有描述不当之处,请帮忙指出,如有错误,会及时修正. 为什么要梳理这篇文章? 最近恰好被问到这方面的问题,尝试整理后发现,这道题的覆盖面可以非常广,很适合作为一道承载知识体系的题目. ...