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