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

Posted 码上加油站

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了本地应用调用远程服务中的方法相关的知识,希望对你有一定的参考价值。


*  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);
}

 

以上是关于本地应用调用远程服务中的方法的主要内容,如果未能解决你的问题,请参考以下文章

网络协议-RPC协议

网络协议-RPC协议

java 远程调用 RPC

Red Gate Ants 不会跟踪已部署代码中的任何方法

既然有http 请求,为啥还要用rpc调用

服务治理框架中的基础配套-RPC(基于TCP)框架