aidl的简单使用

最近用到了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

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值