需求捕鱼达人买道具从支付宝扣两块钱
思路:(关键就是aidl文件的使用,还有就是捕鱼达人隐式启动服务)
(1)步骤
修改 支付宝
1. 把接口文件的后缀名改成aidl
2. aidl文件中所有东西都是public的,不需要也不能自己定义访问修饰符
3. 中间人对象继承Stub,这个对象已经继承了Binder并实现了PublicBusiness接口
修改 捕鱼达人
1. 把05项目的aidl文件复制到06项目,然后aidl所在的包名06和05项目必须一致
2. 把06项目获取到的中间人对象使用Stub.asInterface强转
(2)代码:
//自定义支付宝部分
(1)步骤
1.先在支付宝清单文件中注册服务和action,方便捕鱼达人隐式调用
<service android:name="com.weixin.aidl_alipay.AlipayService">
<intent-filter>
<action android:name="com.weixin.woyaoqian"/>
</intent-filter>
</service>
2.在支付宝里面创建AipayService(可以和第一步放一起)(直接 创建一个新的service)
3.在AipayService服务内部实现一个代理人类
定义一个aidl文件(找到IService.java文件改后缀aidl,可以看做服务的中间人想暴露什么方法,就怎么定义接口),删除public的访问修饰符,修改文件的扩展名为aidl
public class MyBinder extends PayService.Stub
//gen中PayService.java中 // /** Local-side IPC implementation stub class. */ // public static abstract class Stub extends android.os.Binder implements com.weixin.aidl_alipay.aidl.PayService //可以看出IService中的stub内部类继承Binder,实现了PayService,所以下面直接继承PayService.stub就行了
可以看出IService中的stub内部类继承Binder,实现了Iservice,所以下面直接继承IService.stub就行了
package com.weixin.aidl_alipay.aidl;
// Declare any non-default types here with import statements
interface PayService {
//AIDL是用于不同进程间的共享接口,肯定是public,所以不用写,也不能写权限
int callPay(String username ,String password,int money,long time);
}
4. 返回代理人对象
public IBinder onBind(Intent intent) {
// TODO Auto-generated method stub
MyBinder myBinder = new MyBinder();
return myBinder;
}
5.还有支付宝内部的
,根据获得不同的名字,钱数, 返回不同的 code,方便捕鱼达人获取状态public int SafeAlipay(String username ,String password,int money,long time)
(2)具体代码与步骤
首先AndroidStudio使用AIDL跟eclipse还是有区别的,下面讲一下具体怎么操作(有图有真相)
这样就能放在自己想要的包名下面
上面只是用来说明怎么放置AIDL文件的,下图是实际项目中的目录,注意如果提示加载不了一些文件,把Build目录删掉,clean一下就可以了
//AlipayService.java
public class AlipayService extends Service {
//gen中IService.java中
// /** Local-side IPC implementation stub class. */
// public static abstract class Stub extends android.os.Binder implements com.weixin.aidl_alipay.aidl.PayService
//可以看出IService中的stub内部类继承Binder,实现了PayService,所以下面直接继承PayService.stub就行了
public class MyBinder extends PayService.Stub
{
@Override
public int callPay(String username ,String password,int money,long time) {
// TODO Auto-generated method stub
return SafeAlipay( username , password, money, time);
}
}
@Override
public IBinder onBind(Intent intent) {
// TODO Auto-generated method stub
MyBinder myBinder = new MyBinder();
return myBinder;
}
@Override
public void onCreate() {
// TODO Auto-generated method stub
System.out.println("支付宝服务被创建");
super.onCreate();
}
@Override
@Deprecated
public void onStart(Intent intent, int startId) {
// TODO Auto-generated method stub
System.out.println("支付宝服务start");
super.onStart(intent, startId);
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
// TODO Auto-generated method stub
System.out.println("支付宝服务onStartCommand");
return super.onStartCommand(intent, flags, startId);
}
@Override
public void onDestroy() {
System.out.println("支付宝服务被销毁");
// TODO Auto-generated method stub
super.onDestroy();
}
public int SafeAlipay(String username ,String password,int money,long time)
{
System.out.println("加密username");
System.out.println("加密password");
System.out.println("提交数据到支付宝的服务器");
if(money >500)
{
return 505;
}
if("abc".equals(username)&&"123".equals(password))
{
return 200;
}
else {
return 300;
}
}
}
//自定义捕鱼达人部分
1.先把PayService.aidl放在跟支付宝的同一个包中
2.MainActivity.java中一加载,就采用采用bind的方法绑定开启服务
Intent intent = new Intent();
//隐式开启服务
intent.setAction("com.weixin.woyaoqian");
myConn = new MyConn();
boolean state = bindService(intent, myConn, BIND_AUTO_CREATE);
//判断是否成功连接服务
System.out.println("xcqw xcqw state"+state);
3. 实现serviceConnection接口里面的方法
public class MyConn implements ServiceConnection
{
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
//两个进程中间的那块内存一人写一半,然后动态的左右复制来复制去,下面的这个是代理
//Cast an IBinder object into an com.itheima.text.alipay.IService interface,
//generating a proxy if needed
iService = PayService.Stub.asInterface(service);
}
@Override
public void onServiceDisconnected(ComponentName name) {
// TODO Auto-generated method stub
}
}
4.按按钮的时候调用接口里面的方法
iService.callPay("abc", "123", 300, System.currentTimeMillis());
然后根据不同的code打印不同的通知(支付成功,支付失败,登陆失败。。。)
实际项目的目录(注意aidl的目录跟支付宝的目录是一样的!!!!!!)
//IService.aidl(跟支付宝部分一样,一定要放在同一个包里)
// PayService.aidl
package com.weixin.aidl_alipay.aidl;
// Declare any non-default types here with import statements
interface PayService {
int callPay(String username ,String password,int money,long time);
}
//MainActivity.java
public class MainActivity extends Activity {
private MyConn myConn;
private PayService iService;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Intent intent = new Intent();
//隐式开启服务
intent.setAction("com.weixin.woyaoqian");
myConn = new MyConn();
boolean state = bindService(intent, myConn, BIND_AUTO_CREATE);
//判断是否成功连接服务
System.out.println("xcqw xcqw state" + state);
}
public void payToGet(View view) {
try {
int code = iService.callPay("abc", "123", 300, System.currentTimeMillis());
switch (code) {
case 505:
Toast.makeText(this, "余额不足", Toast.LENGTH_SHORT).show();
break;
case 200:
Toast.makeText(this, "支付成功", Toast.LENGTH_SHORT).show();
break;
case 303:
Toast.makeText(this, "太少了", Toast.LENGTH_SHORT).show();
break;
default:
Toast.makeText(this, "用户名错误", Toast.LENGTH_SHORT).show();
break;
}
} catch (RemoteException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public class MyConn implements ServiceConnection {
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
//两个进程中间的那块内存一人写一半,然后动态的左右复制来复制去,下面的这个是代理
//Cast an IBinder object into an com.itheima.text.alipay.IService interface,
//generating a proxy if needed
iService = PayService.Stub.asInterface(service);
}
@Override
public void onServiceDisconnected(ComponentName name) {
// TODO Auto-generated method stub
}
}
}
点我下载源码