一个Service是没有界面且能长时间运行于后台的应用组件.其它应用的组件可以启动一个服务运行于后台,即使用户切换到另一个应用也会继续运行.另外,一个组件可以绑定到一个service来进行交互,即使这个交互是进程间通讯也没问题.例如,一个aservice可能处理网络事物,播放音乐,执行文件I/O,或与一个内容提供者交互,所有这些都在后台进行.
一个service本质上可有两种表现形式:
-
Started
一个service在某个应用组件(比如一个activity)调用startService()时就处于"started"状态(注意,可能已经启动了).一旦运行后,service可以在后台无限期地运行,即使启动它的组件销毁了.通常地,一个startedservice执行一个单一的操作并且不会返回给调用者结果.例如,它可能通过网络下载或上传一个文件.当操作完成后,service自己就停止了
-
Bound
一个service在某个应用组件调用bindService()时就处于"bound"状态.一个boundservice提供一个client-server接口以使组件可以与service交互,发送请求,获取结果,甚至通过进程间通讯进行交叉进行这些交互.一个boundservice仅在有其它应用的组件绑定它时运行.多个应用组件可以同时绑定到一个service,但是当所有的自由竞争组件不再绑定时,service就销毁了.
尽管这个文档是把这两种service分开讲的,但你的service可以在这两种方式下工作.—它可以是started(无限期运行)同时也允许绑定.唯一的简单问题是你是否实现了一对回调方法:onStartCommand()允许组件启动它并且onBind()允许绑定.
不论你是应用是否启动,或绑定到一个服务或两者都做了,任何应用组件都可以使用service(即使从另一个应用),跟任何组件都可以使用activity一样—通过一个Intent启动它.然而,你可以在manifest文件中声明服务为私有,并且阻止另外的应用访问它.这在讲如何于manifest文件中声明service时会详细讲解.
注意:一个service是运行在它所在进程的主线程中的—service不会创建它自己的thread也不会运行于单独的进程(除非你另外指定).这表示,如果你的service想做一些狂耗CPU的工作或阻塞型的操作(比如MP3播放或网络通讯),你必须在service中创建一个新的线程来做那些工作.通过使用一个分离的线程,你将减少"应用没有反应"(ANR)错误并且应用的主线程可以保持activity对用户操作的快速反应.
基础
你应使用一个service还是线程?
一个service是一个在用户不与你的应用交互时依然可以运行于后台的简单组件.所以,只有你需要这样做时才创建一个service.
如果你需要执行的工作不在主线程中,但是只有用户在与你的应用交互时才进行,那么你可能应该创建一个新的线程而不是一个service.例如,如果你想播放一些音乐,但是只在你的activity运行时才播放,你应该在onCreate()中创建一个线程,在onStart()运行这个线程,然后在onStop()中停止它.也可以考虑使用AsyncTask或HandlerThread,来代替传统的线程类.
记住,如果你使用了service,它默认会固定运行于你的应用的主线程,所以你应该在其中创建一个线程来执行耗时或阻塞的操作.
要创建一个service,你必须创建一个Service类(或某个已存在的子类)的子类.在你的实现中,你应覆写一些处理有关service生命期的关键方面的回调方法并且提供一个能让组件绑定到service的机制(如果需要).你应覆写的最重要的回调方法是:
-
onStartCommand()
系统在其它组件比如activity通过调用startService()请求service启动时调用这个方法.一旦这个方法执行,service就启动并且在后台长期运行.如果你实现了它,你需要负责在service完成任务时停止它,通过调用stopSelf()或stopService().(如果你只想提供绑定,你不需实现此方法).
-
OnBind()
当组件调用bindService()想要绑定到service时(比如想要执行进程间通讯)系统调用此方法.在你的实现中,你必须提供一个返回一个IBinder来以使客户端能够使用它与service通讯,你必须总是实现这个方法,但是如果你不允许绑定,那么你应返回null.
-
OnCreate()
系统在service第一次创建时执行此方法,来执行只运行一次的初始化工作(在调用它方法如onStartCommand()或onBind()之前).如果service已经运行,这个方法不会被调用.
-
OnDestroy()
系统在service不再被使用并要销毁时调用此方法.你的service应在此方法中释放资源,比如线程,已注册的侦听器,接收器等等.这是service收到的最后一个调用.
如果一个组件通过调用startService()启动一个service(最终导致onStartCommand()被调用),之后service会保持运行,直到它通过stopSelf()停止自己或另外的组件调用stopService()停止它.
如果一个组件调用bindService()来创建service(onStartCommand()不会被调用),那么service只是运行在绑定期间.一旦service从所有的客户端解除绑定,系统就会杀了它.
Android系统只在内存很少并且必须为具有用户焦点的actvity釋放资源时才会强制停止一个service.如果service是绑定到具有用户焦点的activity上,那么它很难被杀死,并且如果service被声明为运行于前台(后面将讨论),那么它将永不被杀死,除非,如果这个service启动并且长期运行,那么系统将会降低它在后台任务超时列表中的位置然后这个将变成高度易被杀对象—如果你的service被启动,那么它必须被设计为能优雅地处理被系统重启的操作.如果系统杀死了你的service,它会在资源重新可用时立马重启它(但是依赖于你在onStartCommand()中的返回值).关于系统何时杀死一个service的更多信息,请看:android
进程与线程详解.
分享到:
相关推荐
### Android各组件详解——Service深度解析 在深入探讨Service组件之前,我们首先简要回顾一下Android框架中的其他关键组件,尤其是ContentProvider。ContentProvider作为数据访问层,它提供了跨应用共享数据的能力...
根据提供的标题“Android应用开发详解.pdf”以及描述“Android应用开发详解.pdf”,我们可以推断这份文档主要涵盖了关于Android平台上的应用程序开发的相关知识和技术。虽然提供的部分内容似乎并不包含具体的信息,...
《Android应用开发详解》 作者:郭宏志 编著 内容简介 本书分为三个部分,包括基础篇、技术篇和应用篇。由浅入深地讲述了Android应用开发的方方面面。 第一篇 基础篇 第1章 Android概述 Android概述,讲述了...
一、`Service`概述 `Service`是Android四大组件(Activity、BroadcastReceiver、ContentProvider和Service)之一,用于在后台运行没有用户界面的任务。它可以执行下载、上传、音乐播放等操作,不占用用户界面资源。`...
综上所述,《Android入门到精通详解》一书全面覆盖了Android应用程序开发的各个方面,从基础知识到高级技巧都有详细介绍。无论是初学者还是有经验的开发者都能从中受益,掌握开发高质量Android应用程序所需的技能。
《Android应用开发详解源码》目录第1章 Android概述 第2章 Android开发基础 第3章 Android中的资源访问 第4章 Android用户界面 第5章 Android基本程序单元Activity 第6章 Android组件之间的信使Intent 第7章 Android...
### Android底层结构——Service线程详解 #### 一、引言 在Android系统中,`Service` 是一种可以在后台长时间运行的应用组件,它并不提供用户界面。`Service` 在Android应用开发中的作用十分重要,比如音乐播放器...
以下是一些关键知识点的概述: 1. **环境搭建**:首先,你需要安装Android Studio,这是官方推荐的集成开发环境(IDE)。它包含所有必要的工具,如SDK Manager,用于下载Android SDK的不同版本和组件,以及AVD ...
一、Android驱动概述 Android驱动主要分为内核空间驱动和用户空间驱动两部分。内核空间驱动直接与硬件交互,而用户空间驱动则为应用程序提供接口。Android的驱动模型基于Linux内核,因此,Android驱动开发涉及到...
1. **Service概述**:Service是Android四大组件之一,可以在后台长时间运行,执行一些耗时操作,如下载文件、播放音乐等。 2. **重启机制**: - **START_STICKY**:表示服务被杀死后,系统会自动重启该服务,但不会...
1. **Android概述**:介绍Android操作系统的历史、架构和版本,以及它在全球移动设备市场的影响力。 2. **开发环境设置**:指导如何安装和配置Android Studio,这是Google官方推荐的Android开发集成开发环境(IDE)...
### Android启动过程详解 #### 一、概述 Android操作系统启动过程是一个复杂且精细的过程,它涉及到从硬件层面的初始化到最终用户界面的呈现。整个启动流程可以大致分为以下几个阶段: 1. **init进程启动** 2. **...
### Android官方SDK文档Service知识点详解 #### 一、Service概述 **Service** 是Android系统中的四大组件之一,它代表了一个应用程序执行长时间运行操作或者为其他应用程序提供服务功能的需求。与Activity不同,...
不过,尽管目前没有详细内容,我可以概述一些基础的Android系统原理及开发要点的知识点: 1. Android操作系统架构: Android是一个基于Linux内核的开源操作系统,它采用了分层的架构设计,主要包括以下几个层次: -...
### Android项目开发详解知识点概述 #### 一、Android项目开发基础 - **环境搭建**:在开始Android项目开发之前,需要搭建合适的开发环境。这包括安装Java Development Kit (JDK)、Android Studio(官方推荐的集成...
1. Android操作系统概述:Android是由Google主导开发的基于Linux内核的开源操作系统,主要应用于移动设备如智能手机和平板电脑。Android系统以其开放性和灵活性受到众多开发者和厂商的青睐。 2. Android开发环境...
一个典型的Android应用由多个组件构成,如Activity(应用程序界面)、Service(后台服务)、Broadcast Receiver(广播接收器)和Content Provider(内容提供者)。开发者通过这些组件构建交互式、功能丰富的应用程序...