本地应用调用远程服务中的方法



*  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);
}
时间: 2024-08-05 19:28:34

本地应用调用远程服务中的方法的相关文章

绑定服务调用远程服务中的方法

在Andorid平台中,各个组件运行在自己的进程中,他们之间是不能相互访问的,但是在程序之间是不可避免的要传递一些对象,在进程之间相互通信.为了实现进程之间的相互通信,Andorid采用了一种轻量级的实现方式RPC(Remote Procedure Call 远程进程调用)来完成进程之间的通信,并且Android通过接口定义语言(Andorid Interface Definition Language ,AIDL)来生成两个进程之间相互访问的代码,例如,你在Activity里的代码需要访问Se

Unity SLua 如何调用Unity中C#方法

1.原理 就是通常在Lua框架中所说的,开放一个C#的web接口,或者叫做在Slua框架中注册函数. 2.作用 在Lua中调用C#中的方法,这个是在做热更新中很常用的一种方法,无论是slua,还是lua,都差不多.这里,我拿slua举例. 3.实际运用 举例:如何在Slua中打印Log 原理:其实是slua通过调用C#中的Debug.Log方法实现的打印,并不是说是lua中的打印方法起到作用. 步骤: 首先,既然是Lua调用C#中的方法,这里自定义写一个打印log的方法. 1 2 3 4 5 6

webview中js调用Android中的方法

package com.example.helloworld; import android.os.Bundle; import android.app.Activity; import android.content.Intent; import android.view.Menu; import android.webkit.WebView; public class MainActivity extends Activity { private WebView webView = null

使用Java的反射功能调用类中的方法

最近一直在搞Java的反射,今天使用反射调用方法时出现了很多问题,主要是没有详细参考官方API.所以走了很多弯路. 所以想把这个例子记下来,供自己也供他人学习. package com.mine.practice.reflect; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; /** * 使用反射调用类中的方法 * @author 2014-11-5 上午10:51:28

在Android Studio中调用so中的方法

本节用的so是上节用Android Studio创建的so.想在Android Studio中调用so中的方法,需要先引用so.Android Studio中引用so的方法有二种,下面开始介绍. 一 引用so  在app/src/main目录下新建Directory,命名文件夹为jniLIB(文件名不能错),把so文件放进去 ,如图: 二 编写java代码调用so中方法 ①在代码中引用so 创建myJNI.java文件,用System.loadLibrary加载so,同时声明so中的HelloW

通过反射调用类中的方法

操作步骤: 1:实例化Class: 2:通过Class类的getMethod()方法取得一个Method的对象,并设置次方法操作时所需的参数类型: 3:使用invoke进行调用,并向方法中传递要设置的参数,但在使用invoke()方法时必须传入一个类的实例化对象 实例1:sayChina()方法中没有参数 package cn.itcast02; import java.lang.reflect.Method; //调用Person类中的sayChina()方法,没有参数 public clas

使用AIDL调用服务中的方法

AIDL:android interface define language(接口定义语言) 作用:方便远程调用其他服务中的方法 注意:安卓四大组件都要在清单文件注册 aidl创建图: interface InterfaceAidl { void interfacePay(); } public class MyService extends Service { class MyBinder extends InterfaceAidl.Stub { @Override public void i

纯静态界面中(html)中通过js调用dll中的方法从数据库中读取数据

最近接到一个离职员工的任务,一个搭好框架的ERP系统,看了两天,说一下看到的东西,整个项目目录中我没发现一个.aspx后缀的文件,全是静态HTML文件,之后发现他用的jquery简直看的头疼,不过大概能看懂,发现一个可能大家会感兴趣的东西,他在静态界面中通过js对象就直接调DLL中的方法从数据库中得到数据并通过js加载出来,当时我就瞎了,他的大概过程是: 建立了多个js对象(数据库中一张表对应一个),并为这个对象添加了很多与DLL中对应的方法,比如DLL中有一个对用户表修改用户密码的操作,那他j

C#如何静态调用C++中的方法(静态调用dll)

当我们想要在C#中使用C++项目的方法时,这个时候就可以通过调用C++项目的dll来实现,它有静态和动态调用两种方法. DLL(Dynamic Link Library)文件为动态链接库文件,又称“应用程序拓展”,是软件文件类型.在Windows中,许多应用程序并不是一个完整的可执行文件,它们被分割成一些相对独立的动态链接库,即DLL文件,放置于系统中.当我们执行某一个程序时,相应的DLL文件就会被调用.一个应用程序可使用多个DLL文件,一个DLL文件也可能被不同的应用程序使用,这样的DLL文件