一、简介

服务是可以在后台执行长时间运行的应用程序组件,它不提供用户界面。 另一个应用程序组件可以启动一个服务,并且即使用户切换到另一个应用程序,它仍然在后台运行。 另外,组件可以绑定到一个服务来与它进行交互,甚至执行进程间通信(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. 微信小程序 页面跳转传递数据

    点击view 跳转页面 <view class="album_image" data-album-obj="{{item}}" bindtap=" ...

  2. Java进阶之路——从初级程序员到架构师,从小工到专家

    原创文章 怎样学习才能从一名Java初级程序员成长为一名合格的架构师,或者说一名合格的架构师应该有怎样的技术知识体系,这是不仅一个刚刚踏入职场的初级程序员也是工作三五年之后开始迷茫的老程序员经常会问到 ...

  3. textarea只允许上下调节尺寸

    对于extarea,因为如果不做限制的话,它是可以自由调节尺寸的,对于这一点我相信用户是非常喜欢的,因为每个人都有自己认为合适的尺寸,但是对于前端来说就比较头疼了,因为随意调节宽高,就会破坏整体布局, ...

  4. shiro框架的使用实例

    文档路径(包括数据库结构):https://pan.baidu.com/s/1eRP14AI

  5. Hive分区表动态添加字段

    场景描述: 公司埋点项目,数据从接口服务写入kafka集群,再从kafka集群消费写入HDFS文件系统,最后通过Hive进行查询输出.这其中存在一个问题就是:埋点接口中的数据字段是变化,后续会有少量字 ...

  6. 2015四川省acm B题

    Carries frog has n integers a1,a2,-,an, and she wants to add them pairwise. Unfortunately, frog is s ...

  7. SpringBoot整合Mybatis,多数据源,事务,支持java -jar 启动.

    用了一段时间SpringBoot,之前配置MYBATIS ,在打包WAR 放到tomcat下正常,但是WAR已经过时了,现在流行直接打包JAR 丢到DOCKER 里,无奈JAR 启动的时候MAPPER ...

  8. python更新数据库脚本两种方法

    最近项目的两次版本迭代中,根据业务需求的变化,需要对数据库进行更新,两次分别使用了不同的方式进行更新. 第一种:使用python的MySQLdb模块利用原生的sql语句进行更新 import MySQ ...

  9. shell脚本基础 数值运算 判断 及if语句

    数值运算 整数运算[三种,随便掌握一种即可]expr 数字 运算符 数字 [root@ceshiji ~]# expr 1 + 1(运算符号都是+ - * / 注:*需要\*.%是取余,余数只有0 1 ...

  10. freemarker处理哈希表的内建函数

    freemarker处理哈希表的内建函数 1.简易说明 (1)map取值 (2)key取值 2.实现示例 <html> <head> <meta http-equiv=& ...