AIDL 是 Android 中实现跨进程通信的一种方式。下面是一个简单的实现案例,通过 AIDL 实现客户端调用服务端的接口, 实现跨进程通信。
Server
首先,创建一个服务端工程 AIDLServer。main下面创建aidl文件夹,然后在aidl文件夹下创建包和aidl文件,如下:
IMyAidlInterface.aidl 文件内容如下:
1 2 3 4 5 6 7 8 9
| // IMyAidlInterface.aidl package cn.qiracle.aidlserver;
// Declare any non-default types here with import statements
interface IMyAidlInterface { void print(); int add(int a, int b); }
|
这里定义了AIDL接口IMyAidlInterface,接口里定义了两个待实现的方法。然后 重新构建下工程,这样在build目录下就会生成IMyAidlInterface.java 文件。
接着定义一个Service,如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
| package cn.qiracle.aidlserver;
import android.app.Service; import android.content.Intent; import android.os.IBinder; import android.os.RemoteException; import android.util.Log;
public class MyService extends Service { public MyService() { }
@Override public IBinder onBind(Intent intent) { return new MyBinder(); }
class MyBinder extends IMyAidlInterface.Stub {
@Override public void print() throws RemoteException { Log.i("qiracle", "my aidl test"); }
@Override public int add(int a, int b) throws RemoteException { Log.i("qiracle", "a + b:" + (a + b)); return a + b; } } }
|
在这个Service里 ,内部类MyBinder继承IMyAidlInterface.Stub ,然后实现接口里待实现的方法。这两个方法就是提供给客户端进行调用的。
最后,清单文件里记得注册下服务
1 2 3 4 5 6 7 8
| <service android:name=".MyService" android:enabled="true" android:exported="true"> <intent-filter> <action android:name="cn.qiracle.aidlservice" /> </intent-filter> </service>
|
然后启动服务
1 2 3 4
| Intent intent = new Intent(); intent.setAction("cn.qiracle.aidlservice"); intent.setPackage("cn.qiracle.aidlserver"); startService(intent);
|
以上就是AIDL的服务端简单实现。主要就是定义一个AIDL接口,然后在服务里实现这个接口,提供给客户端调用。下面介绍客户端部分。
Client
先建立一个客户端的工程,跟服务端工程一样,需要在main下建立aidl目录,然后在aidl目录下新建包和aidl文件,这里的包名和aidl文件名必须和服务端保持一致。如下:
IMyAidlInterface.aidl 的内容也和 服务端的 IMyAidlInterface.aidl 保持一致
然后,在Activity里绑定服务,如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| Intent intent = new Intent(); intent.setAction("cn.qiracle.aidlservice"); intent.setPackage("cn.qiracle.aidlserver");
bindService(intent, new ServiceConnection() { @Override public void onServiceConnected(ComponentName name, IBinder service) { iMyAidlInterface = IMyAidlInterface.Stub.asInterface(service); }
@Override public void onServiceDisconnected(ComponentName name) {
} },BIND_AUTO_CREATE);
|
可以通过按钮的点击事件,调用服务端的方法。
1 2 3 4 5 6 7 8 9
| public void click(View view){ Toast.makeText(getApplicationContext(),"click",Toast.LENGTH_SHORT).show(); try { iMyAidlInterface.print(); iMyAidlInterface.add(1,2); } catch (RemoteException e) { e.printStackTrace(); } }
|
以上就是客户端实现。
开始运行,注意需要先运行服务端,开启Service,然后运行客户端,绑定服务,通过点击按钮,可以看到服务端控制台有日志打印。
以上,我们就通过AIDL实现了跨进程的调用,方法的实现在服务端,方法的调用在客户端。