一、简介

服务是可以在后台执行长时间运行的应用程序组件,它不提供用户界面。 另一个应用程序组件可以启动一个服务,并且即使用户切换到另一个应用程序,它仍然在后台运行。 另外,组件可以绑定到一个服务来与它进行交互,甚至执行进程间通信(IPC)。 例如,服务可以从后台处理网络交易,播放音乐,执行文件I / O或与内容提供商交互。

这些是三种不同类型的服务:

Scheduled(计划的服务)--- Android 5.0后可用
当在Android 5.0(API级别21)中引入的诸如JobScheduler之类的API启动服务时,将安排一项服务。您可以通过注册作业并指定其网络和时间要求来使用JobScheduler。然后系统在适当的时候优雅地安排作业执行。 JobScheduler提供许多方法来定义服务执行条件。
注意:如果您的应用定位到Android 5.0(API级别21),Google建议您使用JobScheduler执行后台服务。有关使用此类的更多信息,请参阅JobScheduler参考文档。

Started(开始的服务)
当应用程序组件(如活动)调用startService()时,服务将启动。启动后,服务可以在后台无限期运行,即使启动它的组件被销毁。通常,启动服务执行单个操作,并且不会将结果返回给调用者。例如,它可以通过网络下载或上传文件。操作完成后,服务应该停止。

Bound(绑定的服务)

当应用程序的组建调用bindService()时,此组件将绑定到服务。一个绑定的服务提供了 client-server 的接口,允许组件与服务之间进行交互,发送请求,接收结果,甚至可以通过进程间通信(IPC)进行交互。只要绑定了另一个应用程序组件,绑定的服务就会运行。多个组件可以同时绑定到服务,但是当所有组件都解除绑定时,服务将被销毁。

虽然本文通常单独讨论启动和绑定的服务,但您的服务可以以两种方式工作 - 它可以启动(无限期运行)并允许绑定。这只是你是否实现了一些回调方法:onStartCommand()允许组件启动它,并使用onBind()来允许绑定。

无论您的应用程序是启动,绑定还是两者都可以,任何应用程序组件都可以使用该服务(即使是单独的应用程序)也可以使用任何组件可以使用活动(通过以Intent启动它)。但是,您可以在清单文件中将服务声明为私有,并阻止其他应用程序的访问。具体的设置方法,在下面会说明。

注意:服务运行在主线程中,不会创建自己的线程,并且不会在单独的进程中运行,除非另有指定。如果您的服务将执行任何CPU密集型工作或阻塞操作(如MP3播放或网络),则应在服务中创建一个新的线程来完成此工作。通过使用单独的线程,您可以降低应用程序ANR错误的风险,并且应用程序的主线程可以保持专用于与您的活动的用户交互。

二、API概述

重要的回调方法:

onStartCommand()

当另一个组件请求启动该服务时,该系统通过调用startService()来调用此方法。当执行此方法时,服务将启动并可以无限期地在后台运行。 如果您实现了此功能,则您需要通过调用stopSelf()或stopService()来停止其工作完成。 如果您只想提供绑定,则不需要实现此方法。

onBind()

当另一个组件想要与服务绑定(例如执行RPC)时,系统通过调用bindService()来调用此方法。 在实现此方法时,您必须提供一个客户端通过返回IBinder与服务进行通信的接口。 您必须始终执行此方法; 但是,如果您不想允许绑定,则应返回null。
onCreate() 当服务最初创建时(在调用onStartCommand()或onBind())之前,系统调用此方法来执行一次性设置过程。 如果服务已经运行,则不会调用此方法。
onDestroy() 当服务不再使用并被销毁时,系统调用此方法。 您的服务应该实现这一点,以清理任何资源,如线程,注册的听众或接收者。 这是服务接收的最后一个调用。

如果组件通过调用startService()(调用onStartCommand())来启动服务,则服务将继续运行,直到它停止自己的stopSelf()或另一个组件通过调用stopService()来停止它。

如果一个组件调用了bindService()来创建服务,并且onStartCommand()不被调用,那么只要组件被绑定就可以运行这个服务。服务从其所有客户端解除绑定后,系统会将其破坏。

Android系统会在内存不足的时候强制停止服务,并且必须为具有用户焦点的Activity恢复系统资源。如果服务被绑定到具有用户焦点的Activity,则不太可能被杀死;如果服务被声明在前台运行,很少会被杀死。如果服务启动并且长时间运行,系统将随着时间的推移在后台任务列表中降低其位置,并且服务变得非常容易被杀死 - 如果您的服务已启动,则必须设计它以优雅地处理重新启动系统。如果系统杀死您的服务,它将在资源可用时立即重新启动,但这也取决于从onStartCommand()返回的值。

Android Services (后台服务)的更多相关文章

  1. Android之后台服务判断本应用Activity是否处于栈顶

    在Android开发中,我们经常想知道是否自己的服务处于后台运行中,因为在后台运行的服务器优先级会降低,也就极有可能会被系统给回收掉,有什么好办法呢?Google推荐我们将服务运行到前台,如何知道服务 ...

  2. Android中后台的劳动者“服务”

    前言 作为四大组件之一的Service,想必不少开发者都是了解的,那具体熟悉吗?是不是对Service中的每个知识点是否了解,它与Activity的关系又是什么样的,我们所理解的后台服务跟Servic ...

  3. Android 三级联动选择城市+后台服务加载数据库

    技术渣,大家将就着看 首先我们需要一个xml数据保存到数据库,这里我从QQ下面找到一个loclist.xml文件 <CountryRegion Name="中国" Code= ...

  4. Android中如何像 360 一样优雅的杀死后台服务而不启动

    Android中,虽然有很多方法(API或者shell命令)杀死后台`service`,但是仍然有很多程序几秒内再次启动,导致无法真正的杀死.这里主要着重介绍如何像 360 一样杀死Android后台 ...

  5. Android : App客户端与后台服务的AIDL通信以及后台服务的JNI接口实现

    一.APP客户端进程与后台服务进程的AIDL通信 AIDL(Android Interface definition language-“接口定义语言”) 是 Android 提供的一种进程间通信 ( ...

  6. Android中Service(服务)详解

    http://blog.csdn.net/ryantang03/article/details/7770939 Android中Service(服务)详解 标签: serviceandroidappl ...

  7. Android窗口管理服务WindowManagerService计算窗口Z轴位置的过程分析

    文章转载至CSDN社区罗升阳的安卓之旅,原文地址:http://blog.csdn.net/luoshengyang/article/details/8570428 通过前面几篇文章的学习,我们知道了 ...

  8. Android调用Web服务

    现在大部分应用程序都把业务逻辑处理,数据调用等功能封装成了服务的形式,应用程序只需要调用这些web服务就好了,在这里就不赘述web服务的优点了.本文总结如何在android中调用Web服务,通过传递基 ...

  9. mac os使用homebrew来管理后台服务

    在linux下我们经常通过 service 或者 /etc/init.d/来管理我们的后台服务软件,并使用包管理器安装这些软件. 在mac下有homebrew这个好用的工具来安装软件,但是一直没有找到 ...

随机推荐

  1. 【HTTP协议】---TCP三次握手和四次挥手

    TCP三次握手和四次挥手 首先我们知道HTTP协议通常承载于TCP协议之上,HTTPS承载于TLS或SSL协议层之上 通过上面这张图我们能够知道.     在Http工作之前,Web浏览器通过网络和W ...

  2. ASP.NET Core Logging in Elasticsearch with Kibana

    在微服务化盛行的今天,日志的收集.分析越来越重要.ASP.NET Core 提供了一个统一的,轻量级的Logining系统,并可以很方便的与第三方日志框架集成.我们也可以根据不同的场景进行扩展,因为A ...

  3. 利用vitual构造类的动态多态性

    虚函数: 在程序运行过程中调用函数名相同的函数而实现不同功能的函数 利用虚函数这一特性,我们可以在公有继承的基类(父类)中定义虚函数,而在它们的派生类(子类)中通过基类指针来实现派生类中同名函数的调用 ...

  4. C 语言中模板的几种实现方式

    简单宏定义实现 简单宏定义 - 方式一 这种方式将主要实现部分放在一个宏定义中,利用字符替换的方式实现不同 type 的运算,详细思路见代码: simple_macro_1.c #include &l ...

  5. HDFS读写过程

    HDFS的读写过程: 读过程: Client收到用户的读请求——client拿着path向namenode请求文件或者block的datanode列表——client从返回的datanode列表中选择 ...

  6. linux iptables扩展,脚本防火墙

    netfileter:防火墙内核态ip tables:防火墙用户态(管理防火墙规则) iptables的表和链表包括不同的链,链包括大量的规则4个表: raw,mangle,nat,filter5种链 ...

  7. arm上电死机怎么烧写boot

    一般上电到死机还有一段时间,在这段时间完成,已经出现两次了.

  8. Android应用Home键后Launcher重复启动问题

    通过系统方式(系统安装器)安装应用,点击"打开"按钮,进入应用主界面,按home键后,点击应用图标进入,应用会出现重新启动.当完全退出应用后,再通过启动图标进入应用,便不会出现重复 ...

  9. C语言中的可变参数函数的浅析(以Arm 程序中的printf()函数实现为例) .

    我们在C语言编程中会遇到一些参数个数可变的函数,一般人对它的实现不理解.例如Printf(): Printf()函数是C语言中非常常用的一个典型的变参数函数,它 的原型为: int printf( c ...

  10. Sublime Text [Decode error - output not utf-8]

    改Sublime Text的python build的设置.将其编码设置为cp936. 打开Python.sublime-build文件,并添加”encoding”:”cp936″这一行,保存即可 S ...