【四大组件】-- 服务 Service

服务

Service-服务(一)生命周期及使用方式
Service-服务(二)onStartCommand()详解
Service.onStartCommand()详解

什么是服务

它和Activity一样都是Context的子类,只不过它没有UI界面, 是在后台运行的组件。
默认运行在主线程中,因此不要在Service中执行耗时的操作, 除非你在Service中创建了子线程来完成耗时操作。

服务分类

  1. 按照运行地点分类:
    本地服务:运行在相同进程上,不需要IPC就可以与此服务通信。
    远程服务:运行在独立的进程上,使用服务的进程被kill不会对服务进程造成影响,但是使用服务需要IPC机制。

  2. 按照运行类型分类:
    前台服务:会在通知栏显示onGoing的Notification,如音乐播放服务,当服务被终止时,通知栏的Notification也会消失。
    后台服务:默认的服务即后台服务,不会在通知栏显示。
    所谓前台服务只不过是通过一定的方式将服务所在的进程级别提升了。
    前台服务会一直有一个正在运行的图标在系统的状态栏显示, 非常类似于通知的效果。
    由于后台服务优先级相对比较低, 当系统出现内存不足的情况下, 它就有可能会被回收掉, 所以前台服务就是来弥补这个缺点的, 它可以一直保持运行状态而不被系统回收。

  3. 按照使用方式分类:
    startService启动的服务
    bindService启动的服务
    两者同时使用启动的服务

服务的生命周期

  1. 通过startService启动服务
    onCreate()
    onStartCommand(): 每次客户端调用startService()方法启动该Service都会回调该方法( 多次调用) 。 一旦这个方法执行, service就启动并且在后台长期运行。 通过调用stopSelf()或stopService()来停止服务。
    running
    onDestroy()

  2. 通过bindService绑定服务
    onCreate()
    onBind():当组件调用bindService()想要绑定到service时(比如想要执行进程间通讯)系统调用此方法( 一次调用, 一旦绑定后, 下次再调用bindService()不会回调该方法) 。 在你的实现中, 你必须提供一个返回一个IBinder来以使客户端能够使用它与service通讯, 你必须总是实现这个方法, 但是如果你不允许绑定, 那么你应返回null。
    running
    onUnbind(): 当前组件调用unbindService(), 想要解除与service的绑定时系统调用此方法( 一次调用, 一旦解除绑定后, 下次再调用unbindService()会抛出异常) 。
    onDestroy()
    注意: 通过bindService启动的Service的生命周期依附于启动它的Context。 因此当前台调用bindService的Context销毁后, 那么服务会自动停止。

  3. 混合型(bindService和startService同时使用时):
    当一个Service在被启动(startService)的同时又被绑定(bindService), 该Service将会一直在后台运行, 并且不管调用几次, onCreate方法始终只会调用一次,onStartCommand的调用次数与startService调用的次数一致( 使用bindService方法不会调用onStartCommand) 。 同时, 调用unBindService将不会停止Service, 必须调用stopService或Service自身的stopSelf来停止服务。

在什么情况下使用 startService 或 bindService 或 同时使用startService 和 bindService?

  1. 如果你只是想要启动一个后台服务长期进行某项任务那么使用 startService 便可以了。
  2. 如果你想要与正在运行的 Service 取得联系, 那么有两种方法, 一种是使用broadcast , 另外是使用 bindService。
    前者的缺点是如果交流较为频繁, 容易造成性能上的问题, 并且 BroadcastReceiver 本身执行代码的时间是很短的( 也许执行到一半, 后面的代码便不会执行)。
    而后者则没有这些问题, 因此我们肯定选择使用 bindService( 这个时候你便同时在使用 startService 和 bindService 了, 这在Activity 中更新 Service 的某些运行状态是相当有用的) 。
  3. 如果你的服务只是公开一个远程接口, 供连接上的客服端( android 的 Service是C/S架构) 远程调用执行方法。 这个时候你可以不让服务一开始就运行, 而只用bindService , 这样在第一次 bindService 的时候才会创建服务的实例运行它, 这会节约很多系统资源, 特别是如果你的服务是Remote Service, 那么该效果会越明显( 当然在 Service 创建的时候会花去一定时间, 你应当注意到这点)。

服务的执行线程

Service默认并不会运行在子线程中,Service是在主线程里执行操作的,因此,不要在Service中执行耗时的操作,避免因为执行耗时操作而导致ANR,除非你在Service中创建了子线程来完成耗时操作。

常见面试问题

Service相关面试题
service 两种启动方式的生命周期?
Service的两种启动方式?区别在哪?
如何保证Service不被杀死 ?
android六种方法保证service不被杀死
Service与Activity怎么实现通信?
Service相关面试题
IntentService是什么,IntentService原理,应用场景及其与Service的区别?
Android多线程2:IntentService
Service 的 onStartCommand 方法有几种返回值?各代表什么意思?
bindService和startService混合使用的生命周期以及怎么关闭?
Service相关面试题
用过哪些系统Service ?
了解ActivityManagerService吗?发挥什么作用?
ActivityManagerService

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值