这是一个简单的AIDL应用的例子,先讲一下步骤:
1. 新建项目AIDLFakeAlipay
- 在 main目录下创建一个aidl文件夹,右键app->New->Folder->AIDL Folder
-
在aidl文件夹下面创建一个包,在包里面创建一个aidl文件:
image
- 在aidl文件中写一个要被调用的方法,这里面不能加任何权限修饰符,除此之外语法和java相同
// Alipay.aidlpackage com.example.houchongmu.aidlfakealipay;// Declare any non-default types here with import statementsinterface Alipay {/*** Demonstrates some basic types that you can use as parameters* and return values in AIDL.*/String pay(String company,float money,String count,String pwd);}
- 之后可以Build->Make Project,看app/build/source/generated/aidl/debug/步骤二创建的包名/ 下面有没有创建一个Alipay.java文件
- 创建AlipayService,这个服务是用于其他应用通过bindService来绑定的,这里面将上面生成的Alipay.java对象返回出去,虽然返回的是一个Binder对象,但可以认为Alipay.java对象存储在里面,我们后面要在另一个应用中获取到Alipay的对象并调用它的方法。
package com.example.houchongmu.aidlfakealipay;import android.app.Service;import android.content.Intent;import android.os.IBinder;import android.os.RemoteException;import android.util.Log;public class AlipayService extends Service {public AlipayService() {}@Overridepublic IBinder onBind(Intent intent) {return new AlipayBinder();}public String pay(String company,float money, String count, String pwd){Log.d(\"tag\", \"处理了一笔转账业务:company=\"+company+\"/money=\"+money+\"/count=\"+count+\"/pwd=\"+pwd);return count+\"给\"+company+\"支付了\"+money;}class AlipayBinder extends Alipay.Stub{@Overridepublic String pay(String company, float money, String count, String pwd) throws RemoteException {return AlipayService.this.pay(company,money,count,pwd);}}}
这里的Alipay.Stub官方的解释就是
public static abstract class Alipay.Stubextends android.os.Binderimplements AlipayLocal-side IPC implementation stub class.
- 给这个服务添加一个action
<serviceandroid:name=\".AlipayService\"android:enabled=\"true\"android:exported=\"true\"><intent-filter><action android:name=\"com.alipay.payserver\"/></intent-filter></service>
2.建一个AIDLFakeMeituan项目
- 创建一下UI(四个EditText一个Button)
略 - 这里同样需要创建一个AIDL的文件夹,跟上面的步骤是一样的,这里注意aidl的包名必须要跟Alipay的包名一模一样,否则就会出错,aidl文件直接从AIDLFakeAlipay中拷过来就行了,然后Make Project,同样看是否生成了Alipay.java
- 看MainActivity
package com.example.houchongmu.aidlfakemeituan;import android.content.ComponentName;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.text.TextUtils;import android.view.View;import android.widget.EditText;import android.widget.Toast;import com.example.houchongmu.aidlfakealipay.Alipay;import butterknife.BindView;import butterknife.ButterKnife;import butterknife.OnClick;public class MainActivity extends AppCompatActivity {private EditText et_company;private EditText et_money;private EditText et_count;private EditText et_pwd;private Alipay alipay;private AlipayServiceConnection alipayServiceConnection;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);et_company = findViewById(R.id.et_company);et_money = findViewById(R.id.et_money);et_count = findViewById(R.id.et_count);et_pwd = findViewById(R.id.et_pwd);alipayServiceConnection = new AlipayServiceConnection();Intent intent=new Intent(\"com.alipay.payserver\");intent.setPackage(\"com.example.houchongmu.aidlfakealipay\");bindService(intent,alipayServiceConnection,BIND_AUTO_CREATE);}class AlipayServiceConnection implements ServiceConnection{@Overridepublic void onServiceConnected(ComponentName name, IBinder service) {alipay=Alipay.Stub.asInterface(service);//得到Alipay对象Toast.makeText(MainActivity.this, \"服务已经绑定\", Toast.LENGTH_SHORT).show();}@Overridepublic void onServiceDisconnected(ComponentName name) {Toast.makeText(MainActivity.this, \"实在抱歉远程服务已经意外终止了。\", Toast.LENGTH_SHORT).show();}}public void pay(View view) {String company = et_company.getText().toString().trim();String count = et_count.getText().toString().trim();String money = et_money.getText().toString().trim();String pwd = et_pwd.getText().toString().trim();if (TextUtils.isEmpty(company)||TextUtils.isEmpty(count)||TextUtils.isEmpty(pwd)||TextUtils.isEmpty(money)) {Toast.makeText(this, \"输入的内容都不能为空!\", Toast.LENGTH_SHORT).show();return;}if (alipay==null) {Toast.makeText(this, \"服务绑定失败,请重新启动该界面\", Toast.LENGTH_SHORT).show();return;}Float moneyFloat = Float.valueOf(money);try {String result= alipay.pay(company,moneyFloat,count,pwd);Toast.makeText(this, \"转账成功:\"+result, Toast.LENGTH_SHORT).show();} catch (RemoteException e) {e.printStackTrace();Toast.makeText(this, \"转账失败:\" ,Toast.LENGTH_SHORT).show();}}}
- 首先创建一个AlipayServiceConnection,在onServiceConnected方法里面先从AlipayService返回的IBinder对象service中获取到Alipay对象。
- 在onCreate方法里面我们直接去绑定服务,这里的intent需要设置AIDLFakeAlipay中AlipayService设置的action,还需要设置一个组件的包名,就是AlipayService的包名,这样更准确地启动这个Service,但是试了不加这个包名绑定不成功。这样Activity一启动就能与AlipayService服务绑定,并将Alipay赋值。
- 在button的onClick里面,获取到UI输入的值后调用alipay.pay方法,这里可以理解为这个alipay实例就是AIDLFakeAlipay里面Alipay的实例,所以就实现了两个应用跨进程通信。
-
看运行结果:
image
-
AIDLFakeAlipay打印的日志:
image