前言
上篇文章复习总结了 Android 的启动模式,现在开始复习 Service 相关的知识,Service 是一种可以在后台执行长时间运行操作而没有用户界面的应用组件。首先从 Service 的生命周期开始。
Service 的生命周期

onCreate()当实例创建时调用,一个实例只会被调用一次该方法onBind(Intent)当通过 bindService 启动服务时,会调用该方法,该方法会返回一个 IBinder 实例,一个 Service 实例永远只会调用一次。onStartCommand()当通过 startService 启动服务时,会调用该方法,不停的调用 startService 会重复调用该方法。onUnbind(Intent)当所有的连接都断开后会回调该方法,默认该方法返回 false,如果返回 true,再有新的连接会回调onRebind()。onRebind(Intent)当 onUnbind 返回 true 后如果服务还在运行,这时又调用 bindService 会回调该方法,如果返回 false 服务还在运行,那么再调用 bindService 会无反应。onDestory()当 Service 将要被销毁时调用,用于资源的回收。
Service 的启动方式
startService(Intent)
单独通过该方式启动服务,当目标服务还没运行会调用服务的 onCreate、 onStartCommand,如果已经运行了就只会调用 onStartCommand ,当服务开启后就与启动方没有任何关系了,只有当自己调用 stopSelf,或者外界调用 stopService 才会停止,并且无论启动多少次都只需要停止一次就行了。
- 例一 Activity A 连续调用
startService10次启动 Service S,则最后 S 会调用1次onCreate、10次onStartCommand,并且当 A 被退出后 S 会继续运行。
BindService(ServiceConnection)
单独通过该方式启动服务拥有以下特性
当目标服务还没运行会调用服务的
onCreate、onBind,如果已经运行了就只会调用onBind,重复bindService不会重复调用onBind。我们可以在
onServiceConnected获取到一个 IBinder 对象(注意 Service 的onBind方法返回的必须不是 null,不然不会调用该方法),如果 Service 与启动的 Activity 同属于一个进程那么返回的就是 Service 的onBind返回的那个对象,不然返回的是一个 BinderProxy 对象,如果是相同进程我们可以直接将其强转然后调用其方法。不同进程则需要通过AIDL生成的类将其上转型成一个接口,然后才能调用。当通过该方式启动它的 Activity 退出时,如果没有手动调用
unBindService,系统会给我们调用该方法并打印出一段错误,当 Service 的所有的连接都断开了以后会调用 Service 的onUnbind,然后调用onDestroy。
结合调用 bindService 和 startService
- 先调用
startService然后调用bindService,会调用Service的onCreate、onStartCommand、onBind。 - 先调用
bindService然后调用startService, 会调用 Service 的onCreate、onBind、onStartCommand。
当 Service 的所有连接都断了并且调用了 stopService,这种混合启动的 Service 才会被销毁。