Service是一种背景执行长耗时操作的应用组件,他不提供界面,Service默认在其近程的主线程中运行。
1.Service的创建和调用
创建一个Service需要继承Service类并且在AndroidManifest中进行注册:
启动一个Service可以用startService和BindService两种方法
(1)用startService启动,Service会一直运行直到它自己调了stopSelf或者,其他组件调了stopService。
如果一个Service第一次被Start则会调用其onCreate方法,如果之前已经被创建过则不会在调用onCreate,只会调用其onStartCommand方法和onStart方法onStartCommand方法的几个返回值
如果系统kill了Service则不会在自动创建Service
会自动创建并且调用onStartCommand,但是不会将上次的Intent作为参数传入该方法
会自动创建并且调用onStartCommand,但是会将上次的Intent作为参数重新传入该方法
(2)用BindService启动,用BindService启动的服务不会走OnStartCommand和onStart而会走OnBind,当一个服务是用bind方式由另外一个组件启动的时候,这个服务的生命周期会取决于和他绑定的组件当和他绑定的所有组件都不在和他绑定之后他的生命周期会结束。
2.服务的生命周期
3.绑定一个Service
首先你的service必须在onBind方法里面返回一个IBinder对象,这个对象用来让客户端和你的服务进行互动,可以用这个对象提供一个获得该Service对象的方法。
可以写一个类继承自Binder然后提供一个getService方法,然后在onBind函数里面返回这个Binder对象。
需要绑定服务的组件可以调用bindService(intent, mSc,BIND_AUTO_CREATE);方法第二个参数是ServiceConnection这个类的对象,你需要复写ServiceConnection中的
onServiceConnected(ComponentName name, IBinder service)方法和onServiceDisconnected(ComponentName name)方法
onServiceConnected(ComponentName name, IBinder service)方法中的这个IBinder service参数就是你在服务的onBind方法中返回的那个IBinder对象。
你可以将这个参数强行转换成你在Service中实现的Binder类型然后调用事先写好的获得服务对象的接口,然后再将获得的对象转换成你所创建的服务的类型。
4用Messenger跨进程服务交互
其原理是用Messenger通过发送消息的方法来实现进程间的通讯
首先在你的服务中需要有一个handler来处理客户端发来的请求
你还需要在Service中维护一个Messenger对象,并在onBind中返回该Messenger对象的getBinder方法所获得的对象,客户端将通过这Messenger来给服务发消息
在调用Service的组件中,你需要在复写的onServiceConnected方法中,用参数service来创建一个Messenger对象,然后就可以用这个Messenger对象来给服务发消息了。
但是这样只实现了单方通信如果,想让Service也可以给调用它的组件发消息,你需要在组件中也创建一个Handler开来处理消息,并且创建一个Messenger对象来给Service提供发送接口
可以把该对象作为msg.replyTo通过发消息的方式传给Service。