使用AIDL 进程间通信
下面打//*******的那一行 thirdPayAction.requestPay(pay.getText().toString(),100,result);rer
result上几行new 的对象 以判断不为null;
public class MainActivity extends AppCompatActivity {
private static final String TAG = "MainActivity";
private TextView qbNum;
private Button pay;
private boolean isBindService;
private ThirdPayAction thirdPayAction;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initView();
doBindService();
}
/**
* 绑定支付服务
*/
private void doBindService() {
Intent intent = new Intent();
intent.setAction(Constant.ACTION_THREEPAY);
intent.setPackage("com.example.alipay");
intent.addCategory(Intent.CATEGORY_DEFAULT);
isBindService = bindService(intent, serviceConnection, BIND_AUTO_CREATE);
}
public ServiceConnection serviceConnection = new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
Log.d(TAG,"onServiceConnected....");
thirdPayAction = ThirdPayAction.Stub.asInterface(service);
}
@Override
public void onServiceDisconnected(ComponentName name) {
Log.d(TAG,"onServiceDisconnected....");
thirdPayAction =null;
}
};
/**
* 初始化资源
*/
private void initView() {
qbNum = findViewById(R.id.qNum);
pay = findViewById(R.id.pay);
pay.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Result result = new Result();
if(result==null){
Log.d(TAG,"call ==null ");
}
try {
if(thirdPayAction!=null){
thirdPayAction.requestPay(pay.getText().toString(),100,result);///**********
}
} catch (RemoteException e) {
e.printStackTrace();
}
}
});
}
public class Result implements ThirdPayResult {
@Override
public void paySuccess() throws RemoteException {
Log.d(TAG,"充值成功... ");
qbNum.setText("100Q币");
Toast.makeText(MainActivity.this,"充值成功",Toast.LENGTH_SHORT).show();
}
@Override
public void payError(int errorCode, String msg) throws RemoteException {
Log.d(TAG,"充值失败... ");
}
@Override
public IBinder asBinder() {
return null;
}
}
/**
* 解除服务绑定,释放资源
*/
@Override
protected void onDestroy() {
super.onDestroy();
if(isBindService&&serviceConnection!=null){
unbindService(serviceConnection);
serviceConnection=null;
isBindService =false;
}
}
}
模拟支付宝的app:
requestPay(String orderInfo, float money, ThirdPayResult call)
前面参数都传递过来了, 只有ThirdPayResult call 它传递的是null
为什么呢? 为什么呢?
public class ThirdPayImpl extends ThirdPayAction.Stub{
@Override
public void requestPay(String orderInfo, float money, ThirdPayResult call) throws RemoteException {
//第三方支付请求,然后打开一个支付界面。
mcallback =call;
if(call==null){
Log.d(TAG,"传递的回调函数是空");
}
Intent intent =new Intent();
intent.setClass(PayService.this,PayActivity.class);
intent.putExtra(Constant.KEY_BILL_INFO,orderInfo);
intent.putExtra(Constant.KEY_PAY_MONEY,money);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);
}
public void paySuccess(){
try {
if(mcallback!=null){
mcallback.paySuccess();
Log.d(TAG,"支付成功");
}
Log.d(TAG,"mcallback == null");
} catch (RemoteException e) {
e.printStackTrace();
}
}
public void payError(int errorCode,String msg){
try {
if(mcallback!=null){
mcallback.payError(errorCode,msg);
Log.d(TAG,"错误代码"+errorCode+" 错误信息"+msg);
}
} catch (RemoteException e) {
e.printStackTrace();
}
}
}
这是模拟的支付宝服务端
private ThirdPayResult mcallback;
@Override
public void requestPay(String orderInfo, float money, ThirdPayResult call) throws RemoteException {
//第三方支付请求,然后打开一个支付界面。
mcallback =call;
if(call==null){
Log.d(TAG,"传递的回调函数是空"); // 这里log显示了
}
Log.d(TAG,orderInfo+" 11 "+money );
Intent intent =new Intent();
intent.setClass(PayService.this,PayActivity.class);
intent.putExtra(Constant.KEY_BILL_INFO,orderInfo);
intent.putExtra(Constant.KEY_PAY_MONEY,money);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);
}
这是客户端 Result实现接口, 传递的不是空,但模拟支付宝服务端接收的时候时空对象
pay.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Result result = new Result();
if(result==null){
Log.d(TAG,"call ==null ");
}
try {
if(thirdPayAction!=null){
thirdPayAction.requestPay(pay.getText().toString(),100,result);
}
} catch (RemoteException e) {
e.printStackTrace();
}
}
});
public class Result implements ThirdPayResult {
@Override
public void paySuccess() throws RemoteException {
Log.d(TAG,"充值成功... ");
qbNum.setText("100Q币");
Toast.makeText(MainActivity.this,"充值成功",Toast.LENGTH_SHORT).show();
}
@Override
public void payError(int errorCode, String msg) throws RemoteException {
Log.d(TAG,"充值失败... ");
}
@Override
public IBinder asBinder() {
return null;
}
}
客户端传递
因为前面的是基本数据类型,所以传过去了。如果后面的是你自定义的对象,你除了需要序列化,还需要定义一个adil文件。
你是照着视频学的么?照着视频写不出来?