AIDL:进程间的通讯(一个APP与另一个APP交互)
本例子以一个App作为支付应用,另一个App调用支付APP内的支付方法,以此实现进程间的通信。
效果图如下:
第一种是启动支付APP后再调用,第二种时未启动APP直接调用。虽然第二种调用没有和用户交互,支付APP内部的方法其实是已经实现了,可以冲Log看出。
第一种方式打印log如下:
打开支付调用APP打印出日志,表示已经和支付APP建立通讯连接
01-15 10:50:43.498 3087-3087/com.leixiansheng.test2 E/MainActivity: onServiceConnected
点击支付后,支付APP打印日志,表示已经被其他应用调用内部方式
01-15 10:52:29.325 2903-2920/com.leixiansheng.test E/PayService: 支付成功
第二种方式打印log如下:
打开支付调用APP打印出日志,表示已经和支付APP建立通讯连接
01-15 10:50:43.498 3087-3087/com.leixiansheng.test2 E/MainActivity: onServiceConnected
点击支付后,支付APP打印日志,表示已经被其他应用调用内部方式
01-15 10:52:29.325 2903-2920/com.leixiansheng.test E/PayService: 支付成功
可以看出,第二种方式虽然未启动支付APP,但是打印的日志和第一种是一样的,说明在支付APP未运行,依旧可以进行通讯。
好了,效果图和日志都讲解清楚了。现在我们来看看如何在android studio下实现AIDL进程通讯
一、支付APP下
1、新建PayService继承Service。在app右键新建AIDL->PayAidlInterface.aidl
// PayAidlInterface.aidl
package com.leixiansheng.test;
// Declare any non-default types here with import statements
interface PayAidlInterface {
void pay();
}
2、新建成功后,再Build->Make Modle app ,使系统生成对应的AIDL系统文件(注意这步不能省略)
3、然后去实现PayService中的内容,新建内部类继承Stub(这个类就是AIDL make 后自动生成的类),将这个内部类作为IBinder返回
class PayBind extends PayAidlInterface.Stub{
@Override
public void pay() throws RemoteException {
PayService.this.pay(); //本类的pay()方法
}
}
4、最后去清单文件静态注册PayService
<service android:name=".PayService">
<intent-filter>
<action android:name="com.leixiansheng.pay"/>
</intent-filter>
</service>
到此处,支付APP功能就做完了
二、调用支付APP
1、和“一”一样,去新建AIDL(注意,这里的AIDL包名要修改成和“一”中的包名一直,然后将“一”中的PayAidlInterface.aidl复制过来),然后老规矩 Make 一下
2、动态绑定好Service于 支付APP建立连接
3、在需要的地方调用 PayAidlInterface 内的方法即可
到此完结
支付APP代码如下:
1、新建PayService继承Service。在app右键新建AIDL->PayAidlInterface.aidl
2、新建成功后,再Build->Make Modle app ,使系统生成对应的AIDL系统文件(注意这步不能省略)
3、然后去实现PayService中的内容,新建内部类继承Stub(这个类就是AIDL make 后自动生成的类),将这个内部类作为IBinder返回
interface PayAidlInterface {
void pay();
}
public class PayService extends Service {
@Nullable
@Override
public IBinder onBind(Intent intent) {
return new PayBind();
}
class PayBind extends PayAidlInterface.Stub{
@Override
public void pay() throws RemoteException {
PayService.this.pay(); //本类的pay()方法
}
}
private void pay() {
EventBus.getDefault().post(new PayEvent());
Log.e("PayService", "支付成功");
}
}
4、最后去清单文件静态注册PayService
<service android:name=".PayService">
<intent-filter>
<action android:name="com.leixiansheng.pay"/>
</intent-filter>
</service>
调用支付APP代码如下:
1、和“一”一样,去新建AIDL(注意,这里的AIDL包名要修改成和“一”中的包名一直,然后将“一”中的PayAidlInterface.aidl复制过来),然后老规矩 Make 一下
interface PayAidlInterface {
void pay();
}
2、动态绑定好Service于 支付APP建立连接
3、在需要的地方调用 PayAidlInterface 内的方法即可
public class MainActivity extends AppCompatActivity {
Button mPay;
private PayAidlInterface mPayAidlInterface; //接口对象
private ServiceConnection mServiceConnection = new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
Log.e("MainActivity", "onServiceConnected");
mPayAidlInterface = PayAidlInterface.Stub.asInterface(service);//获取到通讯对象
}
@Override
public void onServiceDisconnected(ComponentName name) {
}
};
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mPay = findViewById(R.id.doThing);
Intent intent = new Intent();
//5.0以上必须这样设置
intent.setPackage("com.leixiansheng.test");
intent.setAction("com.leixiansheng.pay");
//绑定建立连接
bindService(intent,mServiceConnection, BIND_AUTO_CREATE);
mPay.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
try {
if (mPayAidlInterface != null) {
mPayAidlInterface.pay();
// Toast.makeText(getApplicationContext(), "支付成功", Toast.LENGTH_SHORT).show();
} else {
Log.e("MainActivity", "null");
}
} catch (RemoteException e) {
e.printStackTrace();
}
}
});
}
@Override
protected void onDestroy() {
super.onDestroy();
unbindService(mServiceConnection); //解绑
}
}