Android Services (后台服务)
一、简介
服务是可以在后台执行长时间运行的应用程序组件,它不提供用户界面。 另一个应用程序组件可以启动一个服务,并且即使用户切换到另一个应用程序,它仍然在后台运行。 另外,组件可以绑定到一个服务来与它进行交互,甚至执行进程间通信(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概述
重要的回调方法:
|
当另一个组件请求启动该服务时,该系统通过调用startService()来调用此方法。当执行此方法时,服务将启动并可以无限期地在后台运行。 如果您实现了此功能,则您需要通过调用stopSelf()或stopService()来停止其工作完成。 如果您只想提供绑定,则不需要实现此方法。 |
|
当另一个组件想要与服务绑定(例如执行RPC)时,系统通过调用bindService()来调用此方法。 在实现此方法时,您必须提供一个客户端通过返回IBinder与服务进行通信的接口。 您必须始终执行此方法; 但是,如果您不想允许绑定,则应返回null。 |
onCreate() | 当服务最初创建时(在调用onStartCommand()或onBind())之前,系统调用此方法来执行一次性设置过程。 如果服务已经运行,则不会调用此方法。 |
onDestroy() | 当服务不再使用并被销毁时,系统调用此方法。 您的服务应该实现这一点,以清理任何资源,如线程,注册的听众或接收者。 这是服务接收的最后一个调用。 |
如果组件通过调用startService()(调用onStartCommand())来启动服务,则服务将继续运行,直到它停止自己的stopSelf()或另一个组件通过调用stopService()来停止它。
如果一个组件调用了bindService()来创建服务,并且onStartCommand()不被调用,那么只要组件被绑定就可以运行这个服务。服务从其所有客户端解除绑定后,系统会将其破坏。
Android系统会在内存不足的时候强制停止服务,并且必须为具有用户焦点的Activity恢复系统资源。如果服务被绑定到具有用户焦点的Activity,则不太可能被杀死;如果服务被声明在前台运行,很少会被杀死。如果服务启动并且长时间运行,系统将随着时间的推移在后台任务列表中降低其位置,并且服务变得非常容易被杀死 - 如果您的服务已启动,则必须设计它以优雅地处理重新启动系统。如果系统杀死您的服务,它将在资源可用时立即重新启动,但这也取决于从onStartCommand()返回的值。
Android Services (后台服务)的更多相关文章
- Android之后台服务判断本应用Activity是否处于栈顶
在Android开发中,我们经常想知道是否自己的服务处于后台运行中,因为在后台运行的服务器优先级会降低,也就极有可能会被系统给回收掉,有什么好办法呢?Google推荐我们将服务运行到前台,如何知道服务 ...
- Android中后台的劳动者“服务”
前言 作为四大组件之一的Service,想必不少开发者都是了解的,那具体熟悉吗?是不是对Service中的每个知识点是否了解,它与Activity的关系又是什么样的,我们所理解的后台服务跟Servic ...
- Android 三级联动选择城市+后台服务加载数据库
技术渣,大家将就着看 首先我们需要一个xml数据保存到数据库,这里我从QQ下面找到一个loclist.xml文件 <CountryRegion Name="中国" Code= ...
- Android中如何像 360 一样优雅的杀死后台服务而不启动
Android中,虽然有很多方法(API或者shell命令)杀死后台`service`,但是仍然有很多程序几秒内再次启动,导致无法真正的杀死.这里主要着重介绍如何像 360 一样杀死Android后台 ...
- Android : App客户端与后台服务的AIDL通信以及后台服务的JNI接口实现
一.APP客户端进程与后台服务进程的AIDL通信 AIDL(Android Interface definition language-“接口定义语言”) 是 Android 提供的一种进程间通信 ( ...
- Android中Service(服务)详解
http://blog.csdn.net/ryantang03/article/details/7770939 Android中Service(服务)详解 标签: serviceandroidappl ...
- Android窗口管理服务WindowManagerService计算窗口Z轴位置的过程分析
文章转载至CSDN社区罗升阳的安卓之旅,原文地址:http://blog.csdn.net/luoshengyang/article/details/8570428 通过前面几篇文章的学习,我们知道了 ...
- Android调用Web服务
现在大部分应用程序都把业务逻辑处理,数据调用等功能封装成了服务的形式,应用程序只需要调用这些web服务就好了,在这里就不赘述web服务的优点了.本文总结如何在android中调用Web服务,通过传递基 ...
- mac os使用homebrew来管理后台服务
在linux下我们经常通过 service 或者 /etc/init.d/来管理我们的后台服务软件,并使用包管理器安装这些软件. 在mac下有homebrew这个好用的工具来安装软件,但是一直没有找到 ...
随机推荐
- img alt与title的区别
前端 alt是图片加载不出来时候,对图片的文本替代 title 是鼠标放在图片上时,对图片的进一步说明 seo 搜索引擎对图片意思的理解主要靠 alt
- 【Unity3D技术文档翻译】第1.1篇 AssetBundle 工作流
译者前言:本章是关于从创建到加载,再到使用 AssetBundle 的整个流程的概述.阅读本章将对 AssetBundle 的工作流程有个简单而全面的了解. 本章原文所在章节:[Unity Manua ...
- 工作笔记--自动切换host的python code
修改host代码: #coding:utf-8import os,timepwd = os.path.dirname(__file__) #获取当前文件夹的绝对路径pull_host_cmd = 'a ...
- 初步探究Android App API接口测试--实战
一.Android App API接口测试 1.如何学好Android App API接口测试 postman可以用来实现API接口自动化测试,但是也有弊端,无法实现接口测试数据的参数化,为了达到接口 ...
- TzObjectInspector 一例
TzObjectInspector Github上的一个开源组件!可以做到类似Delphi IDE属性,事件面板的样式!作者持续更新中... 看起来是这个样子: 这个东西用起来并不像想象的那样可以直接 ...
- mysql4 - 高级操作
一.联结(使用 where(早) 和 join(晚) 都可以完成联结) 1.1 从 Teacher 表和 Profession 表中,查询出老师的名字和所属专业的名称. SELECT t.`l_nam ...
- CodeForces - 551C 二分+贪心
题意:有n个箱子形成的堆,现在有m个学生,每个学生每一秒可以有两种操作: 1: 向右移动一格 2: 移除当前位置的一个箱子 求移除所有箱子需要的最短时间.注意:所有学生可以同时行动. 思路:二分时间, ...
- hbase存储优化
1.上面的2张图主要说明hbase的存储特点 (1).每个值(每条记录的每一个列的值)的存储,都完整的存储了rowkey.column family.column.版本(时间戳),以及该列的值. 这样 ...
- ANTD mobile源码分析 -- popover
最近的开发中要用到很多的各式各样的组件.但是发现ant design mobile(后面简称ANTDM)里很多的资源.于是就分析一下,学习学习. ANTDM直接使用了typescript,没有用ES2 ...
- 自己编写的仿京东移动端的省市联动选择JQuery插件
概述 什么是插件,插件就是即插即用叫插件,很少的配置,很少的代码就可以用都项目里,之所以做这个插件,是因为做了一个省市区的联动,其他项目如果要用怎么办,难道在ctrl+c,ctrl+v?那样做太low ...