简单的AIDL的使用

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

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

		@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
        }
    }
}

点我下载源码



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值