6.5 startService之按图索骥
Service是Android的四大组件之一。和Activity, BroadcastReceiver相比,Service定位于业务层逻辑处理,而Activity定位于前端UI层逻辑处理,BroadcastReceiver定位于通知逻辑的处理。
做为业务服务提供者,Service自有一套规则,先来看有关Service的介绍。
6.5.1 Service知识介绍
四大组件之一的Service,其定义非常符合C/S架构中Service的概念,即为Client服务,处理Client的请求。在Android中,目前接触最多的是Binder中的C/S架构。在这种架构中,Client通过调用预先定义好的业务函数向对应的Service发送请求。作为四大组件之一的Service,其响应Client的请求方式有两种:
Client通过调用startService向Service端发送一个Intent,该Intent携带请求信息。而Service的onStartCommand会接收该Intent,并处理之。该方式是Android平台特有的,借助Intent来传递请求。
Client调用bindService函数和一个指定的Service建立Binder关系,即绑定成功后,Client端将得到处理业务逻辑的Binder Bp端。此后Client直接调用Bp端提供的业务函数向Service端发出请求。注意,在这种方式中,Service的onBind函数被调用,如果该Service支持Binder,则需返回一个IBinder对象给客户端。
以上介绍的是Service响应客户端请求的两种方式,读者务必将两者分清楚。此外,这两种方式还影响Service对象的生命周期,简单总结如下:
对于以startService方式启动的Service对象,其生命周期一直延续到stopSelf或stopService被调用为止。
对于以bindService方式启动的Service对象,其生命周期延续到最后一个客户端调用完unbindService为止。
注意 生命周期控制一般都涉及引用计数的使用。如果某Service对象同时支持这两种请求方式,那么当总引用计数减为零时,其生命就走向终点。
和Service相关的知识还有,当系统内存不足时,系统如何处理Service。如果Service和UI某个部分绑定(例如类似通知栏中Music播放的信息),那么此Service优先级较高(可通过调用startForeground把自己变成一个前台Service),系统不会轻易杀死这些Service来回收内存。
以上这些内容都较简单,阅读SDK文档中Service的相关说明即可了解,具体路径为SDK路径/docs/guide/topics/fundamentals/services.html。
本章不分析和Service相关的函数的原因有二:
Service的处理流程和本章重点介绍的Activity的处理流程差不多,并且Service的处理逻辑更简单。能阅读到此处的读者,想必对拿下Service信心满满。
“授人以鱼,不如授人以渔”。希望读者在经历过如此大量而又复杂的代码分析考验后,能学会和掌握分析方法。