最近用到了aidl,又去重新简单的看了一下它的基本使用,这里发个帖子记录一下。
什么是AIDL?
①aidl 是Android interface definition Language的英文缩写,意思Android 接口定义语言。
②使用aidl 可以帮助我们发布以及调用远程服务,实现跨进程通信。
③将服务的aidl 放到对应的src 目录,工程的gen 目录会生成相应的接口类
我们通过bindService ( Intent , ServiceConnect , int ) 方法绑定远程服务, 在bindService 中有一个ServiceConnec 接口,我们需要覆写该类的onServiceConnected(ComponentName,IBinder)方法,这个方法的第二个参数IBinder 对象其实就是已经在aidl 中定义的接口,因此我们可以将IBinder 对象强制转换为aidl 中的接口类。我们通过IBinder 获取到的对象(也就是aidl 文件生成的接口)其实是系统产生的代理对象,该代理对象既可以跟我们的进程通信,又可以跟远程进程通信,作为一个中间的角色实现了进程间通信。
这里我写了一个Demo,来模拟了一下远程支付
一般使用步骤:
1 首先我们要先android studio中创建一个支付module,在src 目录下定义一个aidl 文件,再创建一个用于支付的服务PayService
/**
* Created by Administrator on 2017/3/27.
*/
public class PayService extends Service {
private static final String TAG = "PayService";
@Nullable
@Override
public IBinder onBind(Intent intent) {
return new PayController();
}
public boolean pay(float money) {
Log.d(TAG, "pay: 成功付款" + money);
return true;
}
@Override
public void onDestroy() {
super.onDestroy();
}
public class PayController extends Alipay.Stub {
@Override
public void basicTypes(int anInt, long aLong, boolean aBoolean, float aFloat, double aDouble, String aString) throws RemoteException {
}
//用来实现支付的方法,即客户端需要调用的方法
@Override
public boolean forwardPayMoeney(float money) throws RemoteException {
return PayService.this.pay(money);
}
}
}
2 在该module中我们启动该服务即可
startService(new Intent(this, PayService.class));
3 新创建一个module,用于模拟客户端支付,将支付module中刚刚生成的aidl文件复制到我们新创建的module,src/main/java文件目录下(要去工作空间里找到文件复制过去,不知道为啥,直接复制过去会报错不能运行。),导入进来要把里面的包改一下
4 客户端支付代码
empty
public class MainActivity extends AppCompatActivity {
private Myconn conn;
private Alipay pay;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// 需要发送隐式意图,去绑定服务
Intent intent = new Intent("www.alipay.pay");
conn = new Myconn();
bindService(intent, conn, BIND_AUTO_CREATE);
}
@Override
protected void onDestroy() {
unbindService(conn);
super.onDestroy();
}
public void useAlipay(View view) {
try {
//调用支付方法
pay.forwardPayMoeney(10.2f);
} catch (RemoteException e) {
e.printStackTrace();
}
}
class Myconn implements ServiceConnection {
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
// 调用gen目录下 Stub抽象类的 com.itheima.alipay.AliPay asInterface(android.os.IBinder obj) 静态方法
// 获得一个AliPay子类对象
pay = Alipay.Stub.asInterface(service);
}
@Override
public void onServiceDisconnected(ComponentName name) {
}
}
}
5 这样我们就完成了,客户端的支付
LOG日志:
D/PayService: onCreate: 远程支付服务已经开启
com.xdkj.aidltest D/PayService: pay: 成功付款10.2