一.实现Binder简单版本(我们模仿AIDL方式生成的接口文件,来自己实现Binder.代替AIDL的创建方式)
1.定义接口
package netease.com.canvasdemo;
import android.os.IBinder;
import android.os.IInterface;
import android.os.RemoteException;
/**
* Created by zhukkun on 7/25/16.
*/
public interface IBank extends IInterface {
static final String DESCRIPTOR = "netease.com.canvasdemo.IBank";
static final int TRANSACTION_queryMoney = (IBinder.FIRST_CALL_TRANSACTION + 0);
public long queryMoney(int uid) throws RemoteException;
}
2.Binder实现类
package netease.com.canvasdemo;
import android.os.Binder;
import android.os.IBinder;
import android.os.IInterface;
import android.os.Parcel;
import android.os.Process;
import android.os.RemoteException;
import android.util.Log;
/**
* Created by zhukkun on 7/25/16.
*/
public class BankImpl extends Binder implements IBank {
public BankImpl() {
Log.d("ClientActivity", "BankImpl Construct,pid"+Process.myPid()+"," + this);
this.attachInterface(this, DESCRIPTOR);
}
public static IBank asInterface(IBinder obj) {
if ((obj == null)) {
return null;
}
android.os.IInterface iin = obj.queryLocalInterface(DESCRIPTOR);
Log.d("ClientActivity", "queryInterface return iin:" + iin +",this,"+obj);
if (((iin != null) && (iin instanceof IBank))) {
return ((IBank) iin);
}
return new BankImpl.Proxy(obj);
}
@Override
public IInterface queryLocalInterface(String descriptor) {
Log.d("ClientActivity", "queryInterface" + descriptor);
Log.d("ClientActivity", "getInterfaceDescriptor" + getInterfaceDescriptor());
if (getInterfaceDescriptor().equals(descriptor)) {
return this;
}
return null;
}
@Override
public IBinder asBinder() {
return this;
}
@Override
public boolean onTransact(int code, Parcel data, Parcel reply, int flags)
throws RemoteException {
switch (code) {
case INTERFACE_TRANSACTION: {
reply.writeString(DESCRIPTOR);
return true;
}
case TRANSACTION_queryMoney: {
data.enforceInterface(DESCRIPTOR);
int uid = data.readInt();
long result = this.queryMoney(uid);
reply.writeNoException();
reply.writeL