* AIDL:安卓接口定义语言 ,来公开服务的接口的方式来暴露服务接口
* IPC:进程间通讯 intel-process communication
* AIDL编写步骤:
远程工程
1. 把IRemoteService.java接口改成.aidl的接口
2. 去掉.aidl接口文件的权限修饰符public
3. 让远程服务里的内部类继承Stub
package com.example.alipay;
import android.app.Service;
import android.content.Intent;
import android.os.IBinder;
import com.example.alipay.IAliPayService.Stub;
public class AliPayService extends Service{
@Override
public IBinder onBind(Intent intent) {
return new XiaoMa();
}
private class XiaoMa extends Stub{
@Override
public int pay(String name, String pwd, float money, long time) {
System.out.println("用户名:"+name);
System.out.println("密码:"+pwd);
if (!"翠花".equals(name) || !"123".equals(pwd)) {
return 300;
}
System.out.println("查询账户余额是否充足");
if (1000 <= money) {
return 400;
}
System.out.println("我是支付宝里的方法:"+money);
return 200;
}
}
}
把IRemoteService.java接口改成.aidl的接口
去掉.aidl接口文件的权限修饰符public
package com.example.alipay;
interface IAliPayService {
/**
* 支付宝支付的方法
*
* @param name
* 用户名
* @param pwd
* 密码
* @param money
* 支付金额
* @param time
* 时间戳
* 返回值:
500:支付宝的错误
400:用余额不足
300:密码或者账号错误
200:支付成功
100:时间又问题
*/
int pay(String name, String pwd, float money, long time);
}
本地工程
4. 创建和远程工程里远程服务组件所在的包名一样的包
5. 把远程工程里的.aidl文件复制到这个包里
6. 在连接成功后,Stub.asInterface(service)
7. 用强转后的对象间接调用远程服务里的方法
package com.example.game;
import com.example.alipay.IAliPayService;
import com.example.alipay.IAliPayService.Stub;
import android.app.Activity;
import android.content.ComponentName;
import android.content.Intent;
import android.content.ServiceConnection;
import android.os.Bundle;
import android.os.IBinder;
import android.os.RemoteException;
import android.view.View;
import android.widget.Toast;
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//绑定远程服务
Intent intent = new Intent();
intent.setAction("com.example.alipay.AliPayService.PAY");
bindService(intent, new PayConn(), BIND_AUTO_CREATE);
}
public void dian(View v){
try {
int code = mService.pay("翠花", "123",1, System.currentTimeMillis());
if (code == 200) {
Toast.makeText(this, "亲爱的,支付成功", 0).show();
}else if(code == 300){
Toast.makeText(this, "亲,请输入正确的账号或者密码", 0).show();
}else if (code == 400) {
Toast.makeText(this, "亲,金额不足", 0).show();
}else if (code == 100) {
Toast.makeText(this, "请5分钟后重新支付", 0).show();
}
} catch (RemoteException e) {
e.printStackTrace();
}
}
private IAliPayService mService;
/**
* activity和service的连接通道
*/
private class PayConn implements ServiceConnection {
@Override
public void onServiceDisconnected(ComponentName name) {
}
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
mService = Stub.asInterface(service);
}
}
}
package com.example.alipay;
interface IAliPayService {
/**
* 支付宝支付的方法
*
* @param name
* 用户名
* @param pwd
* 密码
* @param money
* 支付金额
* @param time
* 时间戳
* 返回值:
500:支付宝的错误
400:用余额不足
300:密码或者账号错误
200:支付成功
100:时间又问题
*/
int pay(String name, String pwd, float money, long time);
}