一个Service 是一段长生命周期的,没有用户界面的程序。比较好的一个例子就是一个正在从播放列表中
播放歌曲的媒体播放器。在一个媒体播放器的应用中,应该会有多个activity,让使用者可以选择歌曲并播放
歌曲。然而,音乐重放这个功能并没有对应的activity,因为使用者当然会认为在导航到其它屏幕时音乐应该
还在播放的。在这个例子中,媒体播放器这个activity 会使用Context.startService()来启动一个service,从而
可以在后台保持音乐的播放。同时,系统也将保持这个service 一直执行,直到这个service 运行结束。另外,
我们还可以通过使用Context.bindService()方法,连接到一个service 上(如果这个service 还没有运行将启动
它)。当连接到一个service 之后,我们还可以service 提供的接口与它进行通讯。拿媒体播放器这个例子来说,
我们还可以进行暂停、重播等操作。
服务是运行在后台的一段代码。它可以运行在它自己的进程,也可以运行在其他应用程序的上下文
(context)里面,这取决于自身的需要。其他的组件可以绑定到一个服务(Service)上面,通过远程过程调
用(RPC)来调用这个方法。例如:媒体播放器的服务,当用户退出媒体选择用户界面,仍然希望音乐可以
继续播放,这时就是由服务(Service)来保证当用户界面关闭时音乐继续播放的。
如何使用服务
第一种是通过调用Context.startServece()启动,调用Context.stoptService()结束,startService()可以传递参
数给Service。
第二种方式是通过调用Context.bindService()启动,调用Context.unbindService()结束,还可以通过
ServiceConnection 访问Service。二者可以混合使用,比如说我可以先startServece()再unbindService()。
Service的生命周期
1: startService()后,即使调用startService()的进程结束了,Service 仍然还存在,知道有进程调用
stoptService(),或者Service 自己自杀(stopSelf())就没法了
2: bindService()后,Service 就和调用bindService()的进程同生共死,也就是说当调用bindService()的进
程死了,那么它bind 的Service 也要跟着被结束,当然期间也可以调用unbindService()让Service 结
束
3: 两种方式混合使用时,比如说你startService()了,我bindService()了,那么只有你stoptService()了而
且我也unbindService()了,这个Service 才会被结束。
进程生命周期
1: Android 系统将会尝试保留那些启动了的或者时绑定了的服务进程
2: 如果该服务正在进程的onCreate(),onStart()或者onDestroy()这些方法中执行时,那么主进程将会成为
一个前台进程,以确保此代码不会被停止
3: 如果服务已经开始,那么它的主进程会就重要性而言低于所有可见的进程但高于不可见的进程,由
于只有少数几个进程是用户可见的,所以只要不是内存特别低,该服务不会停止。
4: 如果有多个客户端绑定了服务,只要客户端中的一个对于用户是可见的,即认为该服务可见