关于AIDL的使用---- Android 进程间通讯之一
AIDL AndroidInterface Definition Language,即Android接口定义语言
由于进程间不能共享内存,因此,需要提供一些机制在不同进程之间进行数据通信。
其中AIDL是方法之一,一般都是配合service来进行跨进程通讯,单独AIDL无法通信。
关于AIDL的使用,一般分为server和client端。
Server的实现步骤如下:
1, 在server端生成一个以”.aidl”结尾的文件,定义接口,如下:
接口内容如下:
package com.example.server;
interface IRemoteService {
int getPid();
}
2, 编译完成后会在gen目录下生成一个同样目录的文件,文件名为IRemoteService.java, 如下:
3, 定义一个service TAService, 实现 IRemoteService里的接口
package com.example.server;
import com.example.server.IRemoteService;
import android.app.Service;
import android.content.Intent;
import android.os.IBinder;
import android.os.Process;
import android.util.Log;
public class TAService extends Service {
private static String TAG = "AIDLServer";
@Override
public void onCreate() {
super.onCreate();
Log.i(TAG," onCreate........" + "Thread: " + Thread.currentThread().getName());
}
@Override
public IBinder onBind(Intent arg0) {
Log.i(TAG,"DDService onBind");
return mBinder;
}
private final IRemoteService.Stub mBinder = new IRemoteService.Stub() {
public int getPid(){
Log.i(TAG,"Thread: " + Thread.currentThread().getName());
Log.i(TAG," getPid ");
return Process.myPid();
}
};
}
4, 然后需要在server app 的AndroidManifest.xml 里面声明对应的service
<service
android:name="com.example.server.TAService"
android:enabled="true"
android:exported="true" >
</service>
Client 端实现步骤如下:
5, 定义一个和server端同一目录的aidl文件
文件内容必须和server端的 文件内容一模一样,包括参数名称
package com.example.server;
interface IRemoteService {
int getPid();
}
6, 在对应调用TAService的activity中定义ServiceConnection,实现对应接口,代码如下:
ServiceConnection conn = new ServiceConnection() {
@Override
public void onServiceDisconnected(ComponentName name) {
}
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
remoteService = IRemoteService.Stub.asInterface(service);
try {
int pid = remoteService.getPid();
int currentPid = Process.myPid();
Log.i(TAG,"currentPID: " + currentPid +" remotePID: " + pid);
} catch (RemoteException e) {
e.printStackTrace();
Log.i(TAG,"RemoteException");
}
Log.i(TAG,"bind success! " + remoteService.toString());
}
};
7, 绑定Server端的TAService,代码如下:
Intent intent = new Intent();
ComponentName comp = new ComponentName("com.example.server",
"com.example.server.TAService");
intent.setComponent(comp);
bindService(intent, conn, Context.BIND_AUTO_CREATE);
完成上述步骤以后即可在conn 的回调中执行aidl接口
执行client代码之前首先要执行server端apk,保证TAService已经跑起来,否则client端绑定失败, conn的两个回调函数都跑不起来。
由此可见, AIDL支持跨进程间接口调用,不支持静态数据读取。
demo 代码下载地址如下:
http://download.youkuaiyun.com/detail/kuanxu/9572698