简单的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
//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{@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 } }}
点我下载源码
- AIDL的简单使用
- aidl的简单使用
- AIDL简单的使用
- AIDL的简单使用
- AIDL的简单使用
- aidl的简单使用
- 简单的AIDL的使用
- 一个AIDL的简单使用
- android AIDL的简单使用
- aidl简单的使用步骤
- Aidl 的使用 简单 通讯
- Android AIDL的简单使用
- AIDL旅行记之AIDL的简单使用
- aidl 的简单介绍和使用
- 最简单的Android Aidl 使用
- android中aidl的简单使用
- android简单的AIDL使用示例
- android 简单的aidl
- bootstrap 代码片段
- springMVC整合FastJson实现RestFul风格API
- 如何提高自己的知识水平?
- IndentationError: unindent does not match any outer indentation level(Python你是猪头吗?)
- CentOs6.5 通过vncserver安装oracle
- 简单的AIDL的使用
- Android USB 在framework相关源码浅析
- 自定义表单构件
- windows条件下,Ping加上时间戳,并保存到文件,适用于测试网络
- </li></ul>横向排列
- 【点分治】3365: [Usaco2004 Feb]Distance Statistics 路程统计
- centos6.5编译mcrypt
- C# PropertyInfo 将一个对象赋值到另一个相同名称的对象
- 过滤器(当前登录人的信息(session过期时)进行重新登录)