安卓aidl+service实现第三方支付alipay
一、项目介绍
在andriod开发中,为了跨进程调用第三方服务,通常会使用aidl,即安卓接口定义语言来实现接口的共享,本次案例将详细展示aidl的的使用,以及如何跨进程第三方应用调用支付服务。
二、具体的思路
- 第三方应用绑定服务,实现一个支付成功后的ui变化的接口,点击按钮之后,通过绑定服务返回的类,进行页面的跳转以及接口的传递,此时进入支付界面的activity
- 支付界面的activity也绑定相同的服务,但是返回一个不同于上面的类,输入密码,点击提交,如果密码正确,调用第三方应用传递过来的接口的方法,当然啦,是间断调用,具体在下文有讲
三、具体实现
1. 在main目录下编写两个aidl文件
- 第一个负责请求支付,(在第三方应用界面在点击支付按钮后,页面进行跳转到支付界面)
// ThirdPartPayAction.aidl
package com.alibaba;
import com.alibaba.ThirdPayResult;
interface ThirdPartPayAction {
// 请求支付
void requestPay(String orderInfo,float payMoney,ThirdPayResult callback);
}
- 二个负责具体的支付后的实现(在支付界面输密码后进行支付,第三方应用的界面ui的变化)
//具体的支付行为,由第三方软件实现
// ThirdPayResult.aidl
package com.alibaba;
// Declare any non-default types here with import statements
interface ThirdPayResult {
void onPaySuccess();
void onPayFalied(in int errrorCode, in String msg);
}
2.编写服务并注册到manifest中
- 在服务中,用内部类的方式实现了ThirdPayResult的接口,生成了ThirdPayResultImpl类,由于aidl本身就继承了ibinder,所以可以在onbind()中直接接返回该类
- 上文中已经提到ThirdPayResult是实现点击按钮,实现页面的跳转的,绑定在第三方应用中的服务类
- 其中两个方法,是调用接口来实现ui的变化的,但是他不会亲自调用而是通过调用payaction ->调用ThirdPayResult->调用接口
- ThirdpayResultIMpl主要就是负责支付界面的跳转
- payaction类是绑定在支付界面的服务类,功能是调用ThirdPayResult中的接口的方法,而这个接口实现,是由第三方界面进行提供的,也就是上文中提到了ui的实现
package com.alibaba;
import android.app.Service;
import android.content.Intent;
import android.os.Binder;
import android.os.IBinder;
import android.os.RemoteException;
import android.text.TextUtils;
import android.util.Log;
import androidx.annotation.Nullable;
/**
* 在进行跨包调用的时候,两边都应该先编译
* 不然第三方应用会使用之前的版本,此处不编译相当于没改
*/
public class PayService extends Service {
private static final String TAG = PayService.class.getName();
//注意!此处的一定要写在全局 不然payaction无法调用pay中的此类的paysucess
private ThirdPartPalyImpl mthirdPartPaly = new ThirdPartPalyImpl();
@Nullable
@Override
public IBinder onBind(Intent intent) {
String action = intent.getAction();
Log.e(TAG, "onBind action is --> " + action);
if(action != null) {
if (action.equals("com.alibaba.THIRD_PART_PAY")) {
//说明是第三方支支付请求
Log.e(TAG, "onBind: 返回一个第三方支付类");
return mthirdPartPaly;
}
}
Log.e(TAG, "onBind: 绑定确定支付类" );
return new PayAction();
}
public class PayAction extends Binder {
public void pay(float payMoney){
Log.e(TAG, "调用pay方法");
//支付的方法
mthirdPartPaly.paySuccess();
}
public void onUserCancle(){
//用户点击界面上的取消/退出
Log.e(TAG, "onUserCancle" );
mthirdPartPaly.payFalied(1,"user cancel pay");
}
}
//采用内部类实现接口</