您的位置:首页 > 移动开发 > Android开发

关于AIDL的使用---- Android 进程间通讯之一

2016-07-11 11:13 501 查看
关于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.csdn.net/detail/kuanxu/9572698
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  AIDL Service server client bind