简单的AIDL的使用

来源:互联网 发布:协同过滤推荐算法实例 编辑:程序博客网 时间:2024/06/05 07:16

需求捕鱼达人买道具从支付宝扣两块钱 

思路:(关键就是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

//genPayService.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.还有支付宝内部的

public int  SafeAlipay(String username ,String password,int money,long time)
,根据获得不同的名字,钱数,返回不同的code,方便捕鱼达人获取状态


(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{@Overridepublic int callPay(String username ,String password,int money,long time) {// TODO Auto-generated method stubreturn SafeAlipay( username , password, money, time);}}@Overridepublic IBinder onBind(Intent intent) {// TODO Auto-generated method stubMyBinder myBinder = new MyBinder();return myBinder;}@Overridepublic void onCreate() {// TODO Auto-generated method stubSystem.out.println("支付宝服务被创建");super.onCreate();}@Override@Deprecatedpublic void onStart(Intent intent, int startId) {// TODO Auto-generated method stubSystem.out.println("支付宝服务start");super.onStart(intent, startId);}@Overridepublic int onStartCommand(Intent intent, int flags, int startId) {// TODO Auto-generated method stubSystem.out.println("支付宝服务onStartCommand");return super.onStartCommand(intent, flags, startId);}@Overridepublic void onDestroy() {System.out.println("支付宝服务被销毁");// TODO Auto-generated method stubsuper.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.aidlpackage com.weixin.aidl_alipay.aidl;// Declare any non-default types here with import statementsinterface 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        }    }}

点我下载源码



0 0
原创粉丝点击