Service作为Android中的四大组件之一,有着举足轻重的地位。Service与Activity同级,但没有界面,是后台运行的服务。这个运行的“后台”意味着不可见,不在后台线程中。事实上,四大组件都运行在UI线程中,不能在各自的生命周期方法中进行耗时操作或网络请求。Service还有很多应用场景,比如后台播放音乐,实时更新当前地理位置变化,新闻APP后台离线缓存内容,进程间通信等。Service主要可以分为两类:本地服务和远程服务。比较常用的是本地服务,在程序内部使用。您可以通过Context.startService()启动服务,通过Context.stopService()结束服务。同时,你也可以用Context.bindService()绑定一个service服务本身,或者用Context.unbindService()解除绑定。无论调用多少次startService,只需要调用一次stopService就可以终止服务。RemoteService用于android系统内的应用程序之间。可以定义和公开接口供其他应用程序运行。客户端建立到服务对象的连接并通过该连接调用服务。调用Context.bindService()方法建立连接并启动,调用Context.unbindService()关闭连接。多个客户端可以绑定到同一个服务。如果服务尚未加载,bindService()将首先加载它。有两种启动Service的方式,分别对应Service的两个生命周期。看谷歌官图,简单明了,不再赘述。由于控制服务的启停方式比较简单,这里不再赘述。只是需要提醒的是,这样的话,Activity和Service之间的通信就不那么直接了,因为我们获取不到Service的引用。如果你使用单例获取一个Service的引用,然后获取其中的方法和属性,还可以,但是侵入性比较严重,所以这里不建议你使用这种方法。另一个重要的组件BroadCastReceiver更好的实现了Activity和Service之间的通信,后面的例子中会用到。实战使用简单的音乐播放器。当然是用到了bind和unbind方法。bind是绑定服务,unbind是解除服务绑定,然后调用Service的onDestroy方法销毁。bind可以直接获取Service的引用,可以直接控制service。bind可以用于当前应用中的业务处理,也可以通过AIDL实现进程间通信。本文先介绍第一种。简单介绍一下这个Demo实现的功能。会播放手机SD卡中的歌曲,可以开始和暂停。界面会显示歌曲的时长和歌曲的实时位置。两者交互的实现:1.类引用的直接调用2.广播机制,Service发送,Activity接收。1.在MusicService中新建一个内部类MyBinder,它有一个public方法返回一个Service的实例2.通过MusicService中的onBind方法返回一个MyBinder的实例,用于Activity绑定成功后的回调3.和Activity一样,它需要在manifest中注册4.在Activity中绑定,获取回调Binder,然后获取MusicService实例5.获取MusicService引用,最后可以操作服务播放和暂停音乐6.在onDestroy方法中Activity的,记得解绑Service。否则会和注册的BroadCastReceiver一样,会造成内存泄漏代码地址:https://github.com/JackCho/ServiceDemo1
