android封装aidl接口,Android远端接口AIDL及服务回调用法

在UI线程和Service线程中经常需要进行数据通信,而除了Bundles之外的另一种方法便为AIDL,Demo(Pedometer)步骤、逻辑及代码:

首先先编辑好两个.aidl文件:

IsStepService.aidl:

import

com.jwetherell.pedometer.service.IStepServiceCallback;

interface IStepService {

boolean isRunning();

void setSensitivity(int

sens);

void

registerCallback(IStepServiceCallback cb);

void

unregisterCallback(IStepServiceCallback cb);

}

IsStepServiceCallback.aidl:

interface IStepServiceCallback {

void stepsChanged(int value);

}

第二,实例化两个远程接口:

因为这个程序是一个客户端和一个服务端,而且是相互调用的关系,所以要在客户端中实现IStepServiceCallback:

private static final IStepServiceCallback.Stub mCallback = new

IStepServiceCallback.Stub() {

@Override

public IBinder asBinder() {

return mCallback;

}

@Override

public void stepsChanged(int value) throws RemoteException {

logger.info("Steps=" + value);

Message msg = handler.obtainMessage();

msg.arg1 = value;

handler.sendMessage(msg);

}

};

而在服务端中实现IStepService:

private final IStepService.Stub mBinder = new

IStepService.Stub() { @Override

public boolean isRunning() throws RemoteException {

return running;

}

@Override

public void setSensitivity(int sens) throws RemoteException {

logger.info("setSensitivity: " + sens);

StepDetector.setSensitivity(sens);

}

@Override

public void registerCallback(IStepServiceCallback cb) throws

RemoteException {

if (cb == null) return;

logger.info("registerCallback: " + cb.toString());

cb.stepsChanged(mSteps);

if (!mCallbacks.contains(cb)) mCallbacks.add(cb);

}

@Override

public void unregisterCallback(IStepServiceCallback cb) throws

RemoteException {

if (cb == null) return;

logger.info("unregisterCallback: " + cb.toString());

if (mCallbacks.contains(cb)) mCallbacks.remove(cb);

}

};

最后,就可以利用BindService以及实例化的aidl去实现通信了。

但是值得注意的是,在客户端实例化ServiceConnection并重载onServiceConnected(ComponentName

className, IBinder service)方法时,需要做以下两步:

mService =

IStepService.Stub.asInterface(service);

mService.registerCallback(mCallback);

step1利用aidl的asInterface方法增加一个IStepService实例,step2是将增加的实例注册回调,而且IStepService是在服务端定义的,mCallback则是客户端通过IStepServiceCallback.Stub实例化的。反过来看服务端的IBinder:

public IBinder onBind(Intent intent) {

return mBinder;

}

其中mBinder是IStepService.Stub实例化的,而且IStepService.Stub同样是在客户端定义的。这样,服务端就能调用客户端的方法。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值