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是支付寶的包名


發佈了28 篇原創文章 · 獲贊 7 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章