【朝花夕拾】四大组件之(二)Service篇
一、Service是什么
对于这个问题,想必大家都能说出一二,如“它是四大组件之一”、“在后台处理一些操作”等。咱们这里看看官方文档中的描述,官方语言一般都是准确且言简意赅的,这里可以体验一下其风格。如下是从官方文档中提取的关键部分,比较容易看懂,咱就不翻译了,详情可以阅读原文【What is a Service:https://developer.android.google.cn/reference/android/app/Service.html#what-is-a-service】。
A Service is an application component representing either an application's desire to perform a longer-running operation while not interacting with the user or to supply functionality for other applications to use.
......
Thus a Service itself is actually very simple, providing two main features:
● A facility for the application to tell the system about something it wants to be doing in the background (even when the user is not directly interacting with the application).
● A facility for an application to expose some of its functionality to other applications.
当笔者读到“perform a longer-running operation”的时候,深切感受到官网语言的准确性。因为笔者和很多开发者一样一般会说“在后台处理耗时操作”,显然这是不准确的,但是却找不到更好的语言来描述,知道看到官网的这句,有了“醍醐灌顶”的感觉。另外,如果以后在回答类似“Service是什么”的时候,咱们如果说“官网上说...第一点:XXX,第二点:XXX”,想必档次也会高不少吧!
二、Service使用概述
Service的使用是一种类似于C/S的形式,Service为Server端,正如第一节中提到的它的功能一样——在后台处理事务和向其他app提供功能,而调用服务的地方为Client端。由此可以看出,Service可以在app内部使用,也可以跨进程在不同的app中调用,对应的使用方法也略有不同,但整体上都是分为三个步骤:1)创建Service子类;2)在AndroidManifest.xml中声明;3)在Client端调用Service。后面会分不同的章节依次对这三步进行说明。
三、Service在AndroidManifest.xml中的声明
Service定义好以后,需要在AndroidManifest.xml中声明。这其中有很多可以定义的属性值,android开发者官方文档【<service>:https://developer.android.google.cn/guide/topics/manifest/service-element.html】中有详细的介绍。其给出的可以设置的属性有:
<service android:description="string resource"
android:directBootAware=["true" | "false"]
android:enabled=["true" | "false"]
android:exported=["true" | "false"]
android:icon="drawable resource"
android:isolatedProcess=["true" | "false"]
android:label="string resource"
android:name="string"
android:permission="string"
android:process="string" >
. . .
</service>
其中有很多属性的含义,在笔者另外一篇文章【【朝花夕拾】四大组件之(一)Broadcast篇】第三节“广播的注册”的“静态注册中的属性简介”中介绍过,虽然是声明Broadcast Receiver的属性,但在Service中其含义基本上是一致的,这里就不赘述了。这里仅介绍一下之前没有介绍过的属性含义,主要是翻译官网中的内容并做一些补充。
- android:description
它是一个向用户描述该service的字符串。它应该被设置为对字符串资源的引用,使得它能够像其它用户界面中字符串那样本地化。
- android:isolatedProcess
如果被设置为true,该service将运行在一个特殊的进程中,该进程独立于系统的其他进成并且没有自己的权限。和该service通信的唯一方式就是 Servcie API(binding和starting)。
- android:process
在<application>及其它组件的声明中,都有该属性。这个属性在前面提到的广播篇中介绍过,这里补充说明一些内容。如果该进程以“:”打头,那么它的意思是指要在当前进程名称前面附加上当前的包名,如“:remote”表示当前进程为“packageName:remote”,它是当前app进程私有的一个进程,其他App的组件就不能和它运行在一个进程中。而如果以小写字母打头,如“com.remote”(官方文档中说命名规范中要求必须要含有".",否则会报错),则表示该进程名为“com.remote”,是一个全局进程,可以让不同app中的不同组件共享这个进程。
对于如何正确使用多进程,为什么要用多进程,使用多进程有什么陷阱,在博文【Android多进程总结一:生成多进程(android:process属性)—https://blog.csdn.net/lixpjita39/article/details/77435156】中有更多的讲解,另外该篇文章所参考的文章也值得一读。
Service的启动方式
Service生命周期
IntentService
Service工作线程
Service跨进程通信
Service与子线程
当提起Service的时候,很多人会联想到子线程,尤其对于初学者而言,甚至会把这两者的功能混为一谈,分不清楚这两者之间的区别。事实上,笔者在工作的前几年也没有很清楚地分清过它们的区别,所以这里就重点探讨一下这两者之间的联系、区别以及如何选择吧。
1、Service和子线程的联系
之所以会把这两者联系在一起,有很大一部分原因是它们都和后台和耗时扯上了关系。子线程是相对主线程而言的,在Android中,说到主线程就是指的UI线程,在UI线程中不允许处理耗时的操作,否则在系统规定的时间内会报ANR。耗时的操作如请求网络、操作数据库等就需要在子线程中去完成,所以子线程也被称为工作线程,相对于UI线程来说,子线程就是一个在后台运行的线程。而Service呢,在我们的认识当中,它也是用来处理一些后台任务的,一些需要长时间运行和比较耗时操作也会考虑放到这里运行,比如下载任务 ,播放音乐等。所以,如果没有一定的经验,确实是很容易混淆的。
2、Service和子线程的区别
事实上,如果没有做特别的处理,Service的生命周期函数在默认情况下都是运行在UI线程中的。Android这里提到的后台的概念,也是相对UI来说的,是指它的运行完全不依赖于UI,譬如正在使用的app就是一个前台进程,当按下Home键后,就变成了一个后台进程了。所以Service和子线程是没有半毛钱的关系的。既然Service是运行在UI线程的,那么它如何处理那些耗时操作的呢,难道不会阻塞UI线程发生ANR吗?事实上,这些耗时的操作也是在Service中开启子线程来完成的。
3、Service与子线程的选择
既然在Service中处理耗时操作也需要开启子线程,那为什么不直接在Acitivty中开启子线程,而非要多此一举开启服务然后再开子线程呢?这是因为Activity由于用户使用情况,经常会退出某个Activity去做其它操作,不会长时间停留在该Activity,如果在Acitivity中开了一个子线程,当Activity销毁以后,就没有办法再获取并控制这个子线程的实例了。而Service却可以长时间在后台运行,只要这个Service不被销毁,那么其他组件即便是销毁了,只要和该Service重新建立关联,就又能够获取到原有的Service中Binder的实例,对其中的子线程实例进行操作。
当然,启用Service也不是一本万利的,因为Service是一个组件,势必要增到系统的开销,谷歌官方文档【https://developer.android.google.cn/guide/components/services#Basics】中也明确说明,应仅在必要时才创建服务。一般来说,如果是耗时不是太长的操作,且和activity有较多的交互,那么选择直接在Activity中开启子线程比较好。比如读取数据库中的数据并显示在界面上,以及获取网络数据并显示等,耗时不会太长且得到数据后要及时与activity交互,很明显就没有必要开启Service了。但是,如果像下载大文件这类需要较长时间完成的操作,就需要开启Service来完成了。Service也可以和界面交互,如前台Service,就会在通知栏上有和Service交互的界面。
另外需要注意的是,这里所说的子线程,并不仅仅指传统的Thread类,还包括AsyncTask、HandlerThread等形式。
不同版本中Service重要功能变迁
android 8.0启动后台服务
Service处理耗时操作
https://blog.csdn.net/javazejian/article/details/52709857
https://www.jianshu.com/p/95ec2a23f300
https://developer.android.google.cn/reference/android/app/Service.html
【朝花夕拾】四大组件之(二)Service篇的更多相关文章
- Android 四大组件之二(Service)
service可以在和多场合的应用中使用,比如播放多媒体的时候用户启动了其他Activity这个时候程序要在后台继续播放,比如检测SD卡上文件的变化,再或者在后台记录你地理信息位置的改变等等,总之服务 ...
- [Android四大组件之二]——Service
Service是Android中四大组件之一,在Android开发中起到非常重要的作用,它运行在后台,不与用户进行交互. 1.Service的继承关系: java.lang.Object → andr ...
- 6、四大组件之二-Service初步
一.什么是Service 有些用时比较长得操作我们希望他在后台运行 ,不耽误我们当前的操作 . 这就引入了Service概念 . 常见的比如:访问网络 , 文件IO操作 , 大数据的数据库任务,播放音 ...
- 11、四大组件之二-Service高级(二)Native Service
一.Service的分类 1.1>Android Service 使用Java编写在JVM中运行的服务 1.2>Native Service 使用C/C++完成的服务,一般在系统开始时完成 ...
- 7、四大组件之二-Service高级
一.Native Service 1>什么是Native Service 使用JNI编写,在系统启动完成之前启动的系统级服务. 2>哪些服务是Native Service ACCESSIB ...
- Android四大组件之服务-Service 原理和应用开发详解
一.Android 服务简介 Service是android 系统中的四大组件之一(Activity.Service.BroadcastReceiver.ContentProvider),它跟Acti ...
- Android四大组件初识之Service
Service作为Android四大组件之一,可以与Activity建立双向连接(绑定模式),提供数据和功能.也能够接收Intent单方面请求(调用模式),进行数据处理和调度功能. Service与A ...
- 入职小白随笔之Android四大组件——服务(Service)
Service Android多线程编程 当我们在程序中执行一些耗时操作时,比如发起一条网络请求,考虑到网速等原因,服务器未必会立刻响应我们的请求,此时我们就需要将这些操作放在子线程中去运行,以防止主 ...
- Android四大组件之一:Service(服务)
Service跟Activity也是出于统一级别的组件,且与Activity的最大区别之一主要是没有人机界面,主要是运行在程序的后台(我是这么理解的),帮助文档上说的是运行于进程的主线程中,但是服务并 ...
- Android 四大组件(Activity、Service、BroadCastReceiver、ContentProvider)
转载于:http://blog.csdn.net/byxdaz/article/details/9708491 http://blog.csdn.net/q876266464/article/deta ...
随机推荐
- 选择排序SelectionSort
转自https://www.cnblogs.com/shen-hua/p/5424059.html a) 原理:每一趟从待排序的记录中选出最小的元素,顺序放在已排好序的序列最后,直到全部记录排序完毕. ...
- storage.go
package storage import ( "fmt" "os" ) const DEFAULT_STORAGE_ENGINE = &qu ...
- engine_init_options.go
package ) type { options.PersistentStorageShards = defaultPersistentStorageShards } }
- BZOJ_1803_Spoj1487 Query on a tree III_主席树+dfs序
BZOJ_1803_Spoj1487 Query on a tree III_主席树 Description You are given a node-labeled rooted tree with ...
- BZOJ_4818_[Sdoi2017]序列计数_矩阵乘法
BZOJ_4818_[Sdoi2017]序列计数_矩阵乘法 Description Alice想要得到一个长度为n的序列,序列中的数都是不超过m的正整数,而且这n个数的和是p的倍数.Alice还希望 ...
- 【爆料】-《堪培拉大学毕业证书》Canberra一模一样原件
☞堪培拉大学毕业证书[微/Q:2544033233◆WeChat:CC6669834]UC毕业证书/联系人Alice[查看点击百度快照查看][留信网学历认证&博士&硕士&海归& ...
- 「Continuous_integration, CI」为什么要持续集成?
前言 什么是持续集成,为什么要持续集成?本文对持续集成前后两种开发实践做了对比分析,从而直观的感受到持续集成的好处. 在说持续集成之前,先说一下传统的开发模式: 传统模式: 传统模式过程如下: 传 ...
- Java 泛型完全解读
对于泛型的使用我想大家都非常熟悉,但是对于类型擦除,边界拓展等细节问题,可能不是很清楚,所以本文会重点讲解一下:另外对泛型的了解其实可以看出,一个语言特性的产生逻辑,这对我们平时的开发也是非常有帮助的 ...
- I/O基础之概念
1:I/O流就是常说的输入/输出流,用于数据在内存与存储设备(硬盘,文件等)之间的数据传输. 2 : 分类 根据操作分:输入流与输出流 输入流:将外部设备中的数据(包括网络数据)读入内存 ...
- 折腾Java设计模式之解释器模式
解释器模式 解释器模式是类的行为模式.给定一个语言之后,解释器模式可以定义出其文法的一种表示,并同时提供一个解释器.客户端可以使用这个解释器来解释这个语言中的句子. 意图 给定一个语言,定义它的文法表 ...