android studio下的aidl通信

eclipse时代做的aidl已经不适用了,最近正好处理该方面问题

记录一下Android studio下的使用


业务场景形象具体化为,游戏应用A调用支付应用B进行支付。A就当做王者荣耀吧,B就当做阿里支付宝吧

A使用B支付n元,得到n*10颗钻石

因此服务平台方对位提供的方法有两个

(1)进行支付

(2)返回相应钻石

在支付宝中定义aidl文件

interface IAlipayService {

            boolean payMoney(int money);

            Diamond getDiamond();
}


parcelable Diamond;

两个aidl文件,一个是服务对应的,一个是业务bean对应的(如果你没有bean,只需要使用基本数据类型,该文件可不用)

该bean需事先Parcelable接口


编译一下,就会自动在build-->generate-->source-->aidl目录下自动生成接下来服务中要使用的类


进行支付的业务类

public class AlipayService2 extends Service
{
   private int mMoney;

   IAlipayService.Stub mAlipayService=new IAlipayService.Stub()
   {
      @Override
      public boolean payMoney(int money) throws RemoteException
      {
         mMoney=money;
         if (money>0)
         {
            return true;
         }
         return false;
      }

      @Override
      public Diamond getDiamond() throws RemoteException
      {
         return new Diamond(mMoney*10);
      }
   };

   @Override
   public IBinder onBind(Intent intent)
   {
      return mAlipayService;
   }
}
该支付类声明 action,后面客户端调用需要用到

<service
   android:name=".AlipayService2"
   android:enabled="true"
   android:exported="true">
   <intent-filter>
      <action android:name="com.alibaba.alipay" />
   </intent-filter>
</service>


这样支付端就写完了。

接下来是客户端,如何通信呢?

1 将“”支付宝“”的aidl文件夹下所有目录,拷贝到“王者荣耀”下main目录下.

2 将业务bean放在源代码下,该类所在包的结构和支付宝下的该类结构保持一致

这样整体工作就差不多完成了

3 "王者荣耀”进行调用

package yunnex.com.testgame;

import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.ServiceConnection;
import android.os.IBinder;
import android.os.RemoteException;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Toast;

import yunnex.com.testalipay.IAlipayService;

public class MainActivity extends AppCompatActivity
{

   IAlipayService alipayService;
   @Override
   protected void onCreate(Bundle savedInstanceState)
   {
      super.onCreate(savedInstanceState);
      setContentView(R.layout.activity_main);

      Intent intent = new Intent();
      intent.setAction("com.alibaba.alipay");
      intent.setPackage("yunnex.com.testalipay");

      //支付服务随用随走,不需他一直存活,因此直接绑定而不调用start
      bindService(intent, mConnection, Context.BIND_AUTO_CREATE);
   }

   public void pay(View view)
   {
      try
      {
         int money=1008;
         boolean b = alipayService.payMoney(money);
         if (b)
         {
            Toast.makeText(MainActivity.this, "支付成功"+money+",得到钻石:"+alipayService.getDiamond()
                        .getNum()+"",
                  Toast
                  .LENGTH_SHORT).show();
         }
         else
         {
            Toast.makeText(MainActivity.this, "支付失败", Toast.LENGTH_SHORT).show();
         }
      }
      catch (RemoteException e)
      {
         e.printStackTrace();
      }
   }

   ServiceConnection mConnection = new ServiceConnection()
   {
      @Override
      public void onServiceConnected(ComponentName name, IBinder service)
      {
         alipayService = IAlipayService.Stub.asInterface(service);
      }

      @Override
      public void onServiceDisconnected(ComponentName name)
      {
         alipayService = null;
      }
   };
}


其中

      intent.setAction("com.alibaba.alipay");
      intent.setPackage("yunnex.com.testalipay");
action就是支付服务的action

package是支付宝的包名


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值