Service简介

服务是四大组件之一,可在后台长时间运行,不提供用户界面,意识是系统不容易将其杀死,只有在内存不足或者省电模式下才会杀死。一个应用程序组件可启动一个服务,这个服务可以做播放音乐、计时操作等。

Service的种类

按照运行地点可以分为

类别 区别 优点 缺点 应用
本地服务(Local Service) 该服务依附在主进程上 服务依附在主进程上而不是独立的进程,这样在一定程度上节约了资源,另外Local服务因为是在同一进程因此不需要IPC,也不需要AIDL。相应bindService会方便很多。 主进程被Kill后,服务便会终止 如:音乐播放器播放等不需要常驻的服务
远程服务(Remote Service) 该服务是独立的进程 服务为独立的进程,对应进程名格式为所在包名加上你指定的android:process字符串。由于是独立的进程,因此在Activity所在进程被Kill的时候,该服务依然在运行,不受其他进程影响,有利于为多个进程提供服务具有较高的灵活性。 该服务是独立的进程,会占用一定资源,并且使用AIDL进行IPC稍微麻烦一点。 一些提供系统服务的Service,这种Service是常驻的。

按运行类型分类:

类别 区别 应用
前台服务 会在通知栏显示onGoing的 Notification 当服务被终止的时候,通知一栏的 Notification 也会消失,这样对于用户有一定的通知作用。常见的如音乐播放服务。
后台服务 默认的服务即为后台服务,即不会在通知一栏显示 onGoing的 Notification。 当服务被终止的时候,用户是看不到效果的。某些不需要运行或终止提示的服务,如天气更新,日期同步,邮件同步等。

按使用方式分类:

类别 区别 应用
startService启动的服务 主要用于启动一个服务执行后台任务,不进行通信。停止服务使用stopService。
bindService启动的服务 方法启动的服务要进行通信。停止服务使用unbindService。
同时使用startService、bindService 启动的服务 停止服务应同时使用stopService与unbindService。

Service的生命周期

通过这个图可以看到,两种启动Service的方式以及他们的生命周期,bindService的不同之处在于当绑定的组件销毁后,对应的service也就被kill了。
  • 被启动的服务的生命周期

一个Service被使用startService方法启动,不管是否调用了bindService(绑定服务)或unbindService(解除绑定服务)到该Service,该Service都会在后台运行并不受影响。
  一个Service被使用startService方法启动多少次,onCreate方法只会调用一次,onStartCommand方法将会被调用多次(与startService的次数一致),且系统只会创建一个Service实例(结束该Service也只需要调用一次stopService),该Service会一直在后台运行,直至调用stopService或调用自身的stopSelf方法

注:在系统资源不足的情况下,服务有可能被系统结束(kill);
  • 被绑定的服务的生命周期

如果一个Service在某个Activity中被调用bindService方法启动,不论bindService被调用几次,Service的onCreate方法只会执行一次,同时onStartCommand方法始终不会调用。
  当建立连接后,Service会一直运行,除非调用unbindService来接触绑定、断开连接或调用该Service的Context不存在了(如Activity被Finish——即通过bindService启动的Service的生命周期依附于启动它的Context),系统在这时会自动停止该Service。

  • 被启动又被绑定的服务的生命周期

    当一个Service在被启动(startService)的同时又被绑定(bindService),该Service将会一直在后台运行,并且不管调用几次,onCreate方法始终只会调用一次,onStartCommand的调用次数与startService调用的次数一致(使用bindService方法不会调用onStartCommand)。同时,调用unBindService将不会停止Service,必须调用stopService或Service自身的stopSelf来停止服务。
    官方原文:
    If you do allow your service to be started and bound,then when then service has been started,the System does not destory the service when all clients unbind.Instead,you must explicitly stop the service,by calling stopSelf() or stopService().
    如果你同意你的服务被开启和绑定,然后当服务被开启的时候,当所有的客户端都解除对服务的绑定android操作系统也不会销毁这个服务,相反的你必须显示的调用stopSelf()或者stopService()方法来停止服务。
    什么情况下使用:
    如果你想要与正在运行的Service取得联系,那么有两种方法,一种是使用广播,另外一种方法就是使用bindService来建立联系,前者的缺点是如果交流较为频繁,容易造成性能上的问题,并且BroadcastReceiver本身执行代码的时间是很短的(也许执行到一半,后面的代码便不会执行),而后者则没有这些问题,因此我们肯定选择使用bindService(这个时候你便同时在使用startService和bindService了,这在Activity中更新Service的某些运行状态是相当有用的

  • 当服务被停止时

    当一个服务被终止(stopService、stopSelf、unbindService)时,onDestory方法将会被调用——所以我们需要在该方法中清除一些工作(依附该Service生命周期的,如:停止在Service中创建并运行的线程)。

    特别注意:

    1. 在使用startService方法启动服务后,一定要调用stopService方法来停止该服务(同上,可以在Activity的onDestory中来停止服务);
    2. 在某处调用bindService绑定Service的时候,要在对应的某处调用unbindService来解除绑定(如在Activity中绑定了Service,可以在onDestory中来解除绑定——虽然绑定的Service会在Activity结束时自动解除、停止);
    3. 如果同时使用startService与bindService方法启动Service,需要终止该Service时,要调用stopService和unbindService方法(unbindService依附于启动它的Context,startServicec并不依附于启动它的Context。如果先调用unbindService,这时服务并不会被终止,当调用stopService后,服务才会被终止;如果先调用stopService,服务也不会被终止,当调用unbindService或者之前调用bindService的Context不存在了(如Activity被finish掉了)服务才会自动停止);
    4. 当手机屏幕发生旋转时,如果Activity设置的是自动旋转的话,在旋转的过程中,Activity会重新创建,那么之前通过bindService建立的连接便会断开(之前的Context不存在了),服务也会被自动停止。

Service的使用

在新建一个Service后,记得在AndroidManifest.xml中注册Service,在application内添加需要注册的Service信息:

<service android:name=".service.PlayerService"android:label="PlayerService"android:exported="true" />

Service示例如下:

public class PlayerService extends Service{@Overridepublic void onCreate() {super.onCreate(); } /** * onBind 是 Service 的虚方法,因此我们不得不实现它。* 返回 null,表示客服端不能建立到此服务的连接。*/ @Overridepublic IBinder onBind(Intent intent) { return new MyBinder();}// 已取代onStart方法--onStart方法是在Android2.0之前的平台使用的.// 在2.0及其之后,则需重写onStartCommand方法,同时,旧的onStart方法则不会再被直接调用// (外部调用onStartCommand,而onStartCommand里会再调用 onStart。在2.0之后,// 推荐覆盖onStartCommand方法,而为了向前兼容,在onStartCommand依然会调用onStart方法。@Overridepublic int onStartCommand(Intent intent, int flags, int startId) {return super.onStartCommand(intent, flags, startId); } @Overridepublic boolean onUnbind(Intent intent) { return super.onUnbind(intent);}@Overridepublic void onDestroy() {super.onDestroy(); } // IBinder是远程对象的基本接口,是为高性能而设计的轻量级远程调用机制的核心部分。但它不仅用于远程// 调用,也用于进程内调用。这个接口定义了与远程对象交互的协议。// 不要直接实现这个接口,而应该从Binder派生。// Binder类已实现了IBinder接口class MyBinder extends Binder { /** * 获取Service的方法* @return 返回PlayerService*/ public  PlayerService getService(){return PlayerService.this;}}
}
  • startService启动服务

    通过startService()启动的服务处于“启动”状态,一旦启动,Service就在后台运行,即使启动它的应用组件已经被销毁了。通常started状态的Service执行单任务并且不返回任何结果给启动者(如当下载或上传一个文件,当这项操作完成时,Service应该停止它本身),示例如下:

public class PlayerActivity extends Activity{private Intent intent;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);intent = new Intent(this, PlayerService.class);startService(intent);// 启动服务}@Overrideprotected void onDestroy() {super.onDestroy();stopService(intent);// 在退出Activity时停止该服务}
}
  • bindService绑定服务

    一个绑定的Service提供一个允许组件与Service交互的接口,可以发送请求、获取返回结果,还可以通过跨进程通信来交互(IPC)。绑定的Service只有当应用组件绑定后才能运行,多个组件可以绑定一个Service,当调用unbindService()方法时,这个Service就会被销毁了。

  • Local(本地服务)的绑定

public class PlayerActivity extends Activity{@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);Intent intent = new Intent(this, PlayerService.class);bindService(intent, serviceConnection, Context.BIND_AUTO_CREATE);//绑定目标Service}@Overrideprotected void onDestroy() {super.onDestroy();unbindService(serviceConnection);// 解除绑定,断开连接}// 在Activity中,我们通过ServiceConnection接口来取得建立连接与连接意外丢失的回调ServiceConnection serviceConnection = new ServiceConnection() {            @Overridepublic void onServiceConnected(ComponentName name, IBinder service){// 建立连接// 获取服务的操作对象PlayerService.MyBinder binder = (PlayerService.MyBinder)service;binder.getService();// 获取到的Service即PlayerService} @Overridepublic void onServiceDisconnected(ComponentName name) {// 连接断开}};
}

Service的onBind如果返回null,则调用bindService会启动Service,但不会连接上Service因此ServiceConnection.onServiceConnected不会被调用,但仍然需要使用unbindService方法来断开连接,这样Service才会停止。

Service与Activity一样都存在与当前进程的主线程中,所以,一些阻塞UI的操作(如在Service进行网络请求等)不能放在Service里进行。如果在Service里进行一些耗CPU和耗时操作,可能会引发ANR警告,这时应用会弹出是强制关闭还是等待的对话框。所以,对Service的理解就是和Activity平级的,只不过是看不见的,在后台运行的一个组件,这也是为什么和Activity同被说为Android的基本组件。##

Thread与Service的区别

  • Thread的优先级低于Service的优先级,在系统资源紧张的情况下,优先杀死前者;
  • 在Thread启动后,如果退出当前Activity,则无法对已经启动的Thread进行操作,而服务则可以——因此可以在服务中启动Thread来解决该问题;
  • Service可以进行跨进程访问,而Thread不行;
  • 在应用中,如果是长时间的在后台运行,而且不需要交互的情况下,使用Service;
  • 同样是在后台运行,不需要交互的情况下,如果只是完成某个任务,之后就不需要运行,而且可能是多个任务,需需要长时间运行的情况下使用Thread;
  • 如果任务占用CPU时间多,资源大的情况下,要使用Thread。

Thread和Service应用场合的区别
Android中Service与Thread的区别
Android中Service与Thread的区别

Service系列拓展阅读

【Android】Service前台服务的使用
【Android】远程服务(Remote Service)的使用

Service的基本概念相关推荐

  1. Service worker 的概念和用法

    Service workers 本质上充当 Web 应用程序.浏览器与网络(可用时)之间的代理服务器.这个 API 旨在创建有效的离线体验,它会拦截网络请求并根据网络是否可用采取来适当的动作.更新来自 ...

  2. 夺命雷公狗—angularjs—11—service的基本概念

    我们先来研究下service里面的四大服务.. value 变量 constant  常量 factory   工厂模式 service 服务 <!DOCTYPE html> <ht ...

  3. 聊聊Service Mesh:linkerd

    [编者的话]随着企业逐渐将传统的单体应用向微服务或云原生应用的转变,虽然微服务或者云原生应用能给企业带来更多的好处,但也会带来一些具有挑战的问题,如怎么管理从单体应用转向微服务所带来的服务间通讯的复杂 ...

  4. Kubernetes的Service

    2019独角兽企业重金招聘Python工程师标准>>> 参考https://www.jianshu.com/p/bbb673e79c3e 大致描述一下遇到的问题,在上文中,我起了一个 ...

  5. 初识Service Worker

    当下PWA比较火,而Service Worker是实现PWA的一项关键技术,今天我们一起了解下关于Service Worker的一些基础知识和适用场景. 什么是Server Worker 我们先来看一 ...

  6. 十问 | 关于Service Mesh 和Kubernets的最前沿思考

    小蚂蚁说: 在7月6日ArchSummit全球架构师峰会2018深圳站上,蚂蚁金服平台数据技术部的杨冰.Service Mesh布道师敖小剑.蚂蚁金服技术专家毛小云和来自阿里大文娱UC基础部的曾彬,四 ...

  7. Service和Thread的关系

    不少Android初学者都可能会有这样的疑惑,Service和Thread到底有什么关系呢?什么时候应该用Service,什么时候又应该用Thread?答案可能会有点让你吃惊,因为Service和Th ...

  8. service和thread的区别,何时用service,何时用thread?

    按服务性质分local service和remote service 当它运行的时候如果是Local Service,那么对应的 Service是运行在主进程的 main 线程上的.如:onCreat ...

  9. 微服务架构之「 下一代微服务 Service Mesh 」

    点击上方"朱小厮的博客",选择"设为星标" 做积极的人,而不是积极废人 Service Mesh 被大家称为下一代的微服务,是微服务领域的一颗新星,被大家讨论的 ...

最新文章

  1. ios 界面间跳转方法总结
  2. 【图解】《“十四五”机器人产业发展规划》
  3. 在Linux下远程使用scp拷贝文件
  4. 重温经典算法系列: 动态规划法
  5. 前端学习(80):按类型划分标签(inline)
  6. java poi 3.13_Java 读取Excl文件 (poi-3.13)
  7. 感谢你不哀不丧不怜,为平凡的努力喝彩
  8. thinkphp5 router.php,ThinkPHP5 之route(路由)简述
  9. python正式发布的时间_微软Visual Studio Code 1.44正式发布:加入新Python教程、时间轴视图...
  10. php unset函数 赋值 null来销毁变量
  11. SketchUp Pro 2017 简体中文版的安装与破解
  12. html5经典教程,40个经典HTML5实例教程.pdf
  13. axure rp8.1 注册码
  14. 2017 上海车牌(沪牌)标书购买攻略
  15. h5下划线怎么设置_怎么给文本添加下划线?
  16. Python货币转换Ⅰ
  17. Linux性能优化之 CPU 篇
  18. 后分布式时代: 多数派读写的「少数派」实现
  19. 博文翻译:Tackling the Cold Start Problem in Recommender Systems
  20. it行业se是_IT行业常见职位英文缩写

热门文章

  1. win10远程连接报错:这可能是由于CredSSP加密数据库修正解决方法
  2. 秒懂Linux之实用命令大全
  3. python爬取微博配图
  4. opencv3.4.1: ippicv_2017u3_lnx_intel64_20170822.tgz下载包
  5. 车载音频“告别”野蛮生长
  6. dedecms5.7发布文章时自动向百度API提交普通收录
  7. API 生成淘宝数据包 拍拍数据包 差异
  8. 京东上货助手批量抓取淘宝商品步骤
  9. RTX 4090Ti显卡性能怎么样? RTX 4090Ti功耗
  10. 推荐电影一部: 反恐24小时。24Hours