Android AIDL的基本用法

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实现了跨进程的调用,方法的实现在服务端,方法的调用在客户端。

文章目录
  1. 1. Server
  2. 2. Client
|