一、Service分类:
Bound Service和Unbound Service两种
(同一个Service可以是Unbound Service,又同时是Bound Service)
Unbound Service:
启动方式:其他组件调用:
startService()
停止方式:其他组件调用:stopService() 自己调用:stopSelf()
通信:组件无法和Service通信
Bound Service:
启动方式:其他组件调用:
bindService()
停止方式:所有bind组件都调用:unbindService()
通信:通过ServiceConnection
二
、Service定义
(1)onCreate():在onStartCommand()以及onBond()之前调用
(2)onStartCommand() :在其他组件通过startService()方法启动service时调用
(3)onBind() :当其他组件通过bindService()方法与service相绑定之后,此方法
将会被调用。此有一个
IBinder
对象返回值,它用来支撑其他组件与service通信
(4)onDestroy():调用此方法后, Service被销毁
三、Bound Service使用
1、服务端
onBind() 函数返回一个实现IBinder接口的对象。
Binder是一个实现IBinder接口的类。
所以还要实现返回一个IBinder对象的方法:
(1)新建一个类,继承Binder类,该类定义客户端可以调用的方法(一般用于同一个进程内)
(2)使用AIDL接口
<1>定义AIDL接口,并把客户端调用的方法在接口中声明。
<2>系统自动一个实现IInterface接口的类代码,该类中的子类stub继承了Binder类。
<3>stub子类中的
onTransact方法,解包数据,处理远程客户端调用
<4>service新建一个子类继承stub类,并在该类中实现AIDL文件中声明的方法
<4>创建该子类对象,并在onBind() 中返回此对象
2、客户端
调用
bindService()去绑定一个服务。
public boolean bindService(Intent service, ServiceConnection conn, int flags) { return mBase.bindService(service, conn, flags);}
需要三个参数:1、Intent 2、ServiceConnection 3、flags
所以客户需求实现一个ServiceConnection 类,并重写ServiceConnection 的两个回调函数
public void onServiceConnected(ComponentName name, IBinder service)
public void onServiceDisconnected(ComponentName name)
onServiceConnected函数会回传服务器的IBinder接口的对象,通过此对象可以调用
Service曝光的的方法。
(1)使用
继承Binder类方式,客户端接收到IBinder指针时,需要把指针转换为具体的Service定义的类,才能调用曝光的方法(所以不适合进程间调外,如果客户端进程也定义了相同名字的类,会出问题)
(2)使用AIDL方式,通过com.cvte.tv.hotkey.IHotkeyService.Stub.asInterface(IBinder)转换成曝光的类
asInterface如何转换IBinder类:
<1>、查询本地是否有此类
<2>、返回Proxy类
<3>Proxy类对
调用接口参数做组包封装:
<4>所以客户端可以直接做远程调用