Android组件 Service详细介绍

一、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>所以客户端可以直接做远程调用




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值