在实际android应用开发过程中,两个应用的独立进程之间的通讯,还有一个应用中的两个进程之间的通讯都是需要使用aidl技术来完成。(本期介绍android studio的aidl开发使用,没用使用studio开发的同学,赶紧转吧。)
AIDL:全程Android Interface Definition Language 安卓接口定义语言,它可以用于让某个Service与多个应用之间进行跨进程通讯,从而实现多个应用共用一个Service的功能。
本期介绍的是同一个应用中的两个独立进程,如果两个应用,两个进程之间通讯,需要吧aidl文件夹copy到另个工程中,然后通过隐士方法启动service就可以了,原理都是相同的。核心步骤代码如下:
1.首先创建一个项目工程,点击src右键---》AIDL---》aidl文件。创建aidl文件
aidl文件内容
package com.zxq.zjctx;
interface IMyAidlInterface {
void sservice();
}
2.创建完成之后,build一下,不行就重启一下studio,然后写自己的service文件,在Service类中创建ibander对象并返回
@Override
public IBinder onBind(Intent intent) {
Log.e("))))->","onBind");
return mIBinder;
}
private IBinder mIBinder = new IMyAidlInterface.Stub() {
@Override
public void sservice() throws RemoteException {
stopservice();//要调用的方法。
}
};
给service设置一个独立的进程。
<service
android:name="service.MyService"
android:process="com.zxq.zjctx.dulijincheng"
/>
3. 在启动service的类中执行下面的代码,拿到那个接口,通过接口去掉用
Intent intent=new Intent(this,MyService.class);
startService(intent);
bindService(intent,new MyserviceConnect(), Context.BIND_AUTO_CREATE);
public class MyserviceConnect implements ServiceConnection {
@Override
public void onServiceConnected(ComponentName componentName, IBinder iBinder) {
iMyAidlInterface = IMyAidlInterface.Stub.asInterface(iBinder);//通过这个对象去掉用方法。
}
@Override
public void onServiceDisconnected(ComponentName componentName) {
}
}
4.调用传递过来对象ImyAidlInterface,这个接口中自己定义的什么方法就调用什么方法。
原理:
通过ibinder对象实现数据共享。在多进程中ibinder就可以理解成在一个公共的内存中;因为在两个工程中使用的是用一个aidl文件,在创建两个service时,分别在onbind方法中返回同一个adil文件创建的对象;然后在bindservice的时候,在onServiceConnected的方法中的Ibinder对象就是另一个进程实现的aidl接口的实现类对象;就可以调用了;
给service设置一个独立的进程。