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