一、Service 介绍
服务是Android中实现程序后台运行的解决方案,他非常适合是去执行那些不需要和用户交互而且还要长期运行的任务。服务的运行不依赖于任何用户界面,即使程序被切换到后台,或者用户打开了另一个应用程序,服务仍然能够保持独立运行。不过需要注意的是,服务并不是运行在一个独立的进程当中,而是依赖于创建服务时所在的应用程序进程。当某个应用程序被杀掉时,所有依赖该进程的服务也会停止运行。
二、Service 的生命周期
三、Service 的两种状态
-
启动状态
当应用组件(如 Activity)通过调用 startService() 启动服务时,服务即处于“启动”状态。一旦启动,服务即可在后台无限期运行,即使启动服务的组件已被销毁也不受影响,除非手动调用才能停止服务, 已启动的服务通常是执行单一操作,而且不会将结果返回给调用方。
操作回调打印
操作流程:第一次启动服务- --》第二次调用启动服务---》第三次关闭服务--》第四次启动服务--》第五次启动服务
onCreate...
onStartCommand...
onStartCommand...
onDestroy...
onCreate...
onStartCommand...
onStartCommand...
通过上面的操作打印得知,在我们第一次启动服务的时候,会执行service中的 oncreate 还有 onStartCommand(前提是服务在之前还没有进行启动) 否则 他只会单独调用 onStartCommand方法 ,使用 stopservice() 就能够停止服务。
-
绑定状态
当应用组件通过调用 bindService() 绑定到服务时,服务即处于“绑定”状态。绑定服务提供了一个客户端-服务器接口,允许组件与服务进行交互、发送请求、获取结果,甚至是利用进程间通信 (IPC) 跨进程执行这些操作。 仅当与另一个应用组件绑定时,绑定服务才会运行。 多个组件可以同时绑定到该服务,但全部取消绑定后,该服务即会被销毁。
操作回调打印
操作流程:第一次启动服务- --》第二次调用启动服务---》第三次关闭服务--》第四次启动服务--》第五次启动服务
onCreate...
onBind...
onServiceConnected...
onDestroy...
onCreate...
onBind...
onServiceConnected...
多次调用bindService方法绑定LocalService服务端,而LocalService得onBind方法只调用了一次,那就是在第一次调用bindService时才会回调onBind方法。
Service 绑定服务使用
当服务在本地使用,不需要跨进程工作时,应用组件与 service 服务进行交互,可以用 Binder 类实现。
流程如下:
1、创建 Binder子类,让前端能够通过 Binder 类实现对 service 的调用。
2、service 中的 onbinder方法返回 Binder 实例
3、在前端中的 onserviceconnected 中接收返回的 Binder 实例。
不同进程间service通信 待定。。。
启动服务与绑定服务的优先级
- 先绑定服务后启动服务
如果当前Service实例先以绑定状态运行,然后再以启动状态运行,那么绑定服务将会转为启动服务运行,这时如果之前绑定的宿主(Activity)被销毁了,也不会影响服务的运行,服务还是会一直运行下去,指定收到调用停止服务或者内存不足时才会销毁该服务。
- 先启动服务后绑定服务
如果当前Service实例先以启动状态运行,然后再以绑定状态运行,当前启动服务并不会转为绑定服务,但是还是会与宿主绑定,只是即使宿主解除绑定后,服务依然按启动服务的生命周期在后台运行,直到有Context调用了stopService()或是服务本身调用了stopSelf()方法抑或内存不足时才会销毁服务。
以上两种情况显示出启动服务的优先级确实比绑定服务高一些。
两种启动方式的区别
待定。。。
四、服务service与线程的区别
- 两者概念的迥异
Thread 是程序执行的最小单元,它是分配CPU的基本单位,android系统中UI线程也是线程的一种,当然Thread还可以用于执行一些耗时异步的操作。
Service是Android的一种机制,服务是运行在主线程上的,它是由系统进程托管。它与其他组件之间的通信类似于client和server,是一种轻量级的IPC通信,这种通信的载体是binder,它是在linux层交换信息的一种IPC,而所谓的Service后台任务只不过是指没有UI的组件罢了。
- 两者的执行任务迥异
在android系统中,线程一般指的是工作线程(即后台线程),而主线程是一种特殊的工作线程,它负责将事件分派给相应的用户界面小工具,如绘图事件及事件响应,因此为了保证应用 UI 的响应能力主线程上不可执行耗时操作。如果执行的操作不能很快完成,则应确保它们在单独的工作线程执行。
Service 则是android系统中的组件,一般情况下它运行于主线程中,因此在Service中是不可以执行耗时操作的,否则系统会报ANR异常,之所以称Service为后台服务,大部分原因是它本身没有UI,用户无法感知(当然也可以利用某些手段让用户知道),但如果需要让Service执行耗时任务,可在Service中开启单独线程去执行。
- 两者使用场景
当要执行耗时的网络或者数据库查询以及其他阻塞UI线程或密集使用CPU的任务时,都应该使用工作线程(Thread),这样才能保证UI线程不被占用而影响用户体验。
在应用程序中,如果需要长时间的在后台运行,而且不需要交互的情况下,使用服务。比如播放音乐,通过Service+Notification方式在后台执行同时在通知栏显示着。
- 两者的真正关系
两者没有半毛钱关系。
参考 https://blog.csdn.net/weixin_39460667/article/details/82770164