android-AIDL
跨进程访问(AIDL服务)
Android系统中的进程之间不能共享内存,因此,需要提供一些机制在不同进程之间进行 数据通信。我们知道4个Android应用程序组件中的3个(Activity、Broadcast和Content Provider)都可以进行跨进程访问,另外一个Android应用程序组件Service同样可以。这就是本节要介绍的AIDL服务。
什么是AIDL服务
为了使其他的应用程序也可以访问本应用程序提供的服务,Android系统采用了远程过程调用(Remote Procedure Call,RPC)方式来实现。与很多其他的基于RPC的解决方案一样,Android使用一种接口定义语言(Interface Definition Language,IDL)来公开服务的接口。因此,可以将这种可以跨进程访问的服务称为AIDL(Android Interface Definition Language)服务
什么是AIDL服务
为了使其他的应用程序也可以访问本应用程序提供的服务,Android系统采用了远程过程调用(Remote Procedure Call,RPC)方式来实现。与很多其他的基于RPC的解决方案一样,Android使用一种接口定义语言(Interface Definition Language,IDL)来公开服务的接口。因此,可以将这种可以跨进程访问的服务称为AIDL(Android Interface Definition Language)服务
A程序
在Eclipse Android工程的Java包目录中建立一个扩展名为aidl的文件
package cn.roco.aidl; interface StudentQuery { String queryStudent( int number); }
编写服务
public class StudentQueryService extends Service { private IBinder binder = new StudentQueryBinder(); private String names[]={ "张飞","李静" ,"赵薇" }; private String query ( int number){ if(number>0 && number<4){ return names[number-1]; } return null; } @Override public IBinder onBind(Intent arg0) { // TODO Auto-generated method stub return binder; } /** * 关闭服务的时候,释放资源 */ @Override public void onDestroy() { for ( int i = 0; i < names. length; i++) { names[i] = null; } } private final class StudentQueryBinder extends cn.roco.aidl.StudentQuery.Stub { @Override public String queryStudent( int no) throws RemoteException { // TODO Auto-generated method stub return query(no); } } }
注册服务
<service android:name =".StudentQueryService" > <intent-filter > <action android:name= "cn.roco.remote.service.student.query" /> </intent-filter > </service >
B程序
讲A 程序的AIDL 文件拷贝过来
private StudentConnection conn= new StudentConnection();
private StudentQuery studentQuery= null;
private class StudentConnection implements ServiceConnection{
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
// TODO Auto-generated method stub
studentQuery=StudentQuery.Stub. asInterface(service);
}
@Override
public void onServiceDisconnected(ComponentName name) {
// TODO Auto-generated method stub
}
}
Intent intent = new Intent("cn.roco.remote.service.student.query");
bindService(intent, conn, BIND_AUTO_CREATE);
String name = studentQuery.queryStudent(1);
调用方法
String name = studentQuery.queryStudent(1);