AIDL

在Android平台,一个进程通常不能访问另一个进程的内存空间。但是android提供了AIDL可以用来进程间数据传递。

     AIDL (Android Interface Definition Language) 是一种IDL 语言,用于生成可以在Android设备上两个进程之间进行进程间通信(interprocess communication, IPC)的代码。如果在一个进程中(例如Activity)要调用另一个进程中(例如Service)对象的操作,就可以使用AIDL生成可序列化的参数。
    AIDL IPC机制是面向接口的,像COM或Corba一样,但是更加轻量级。它是使用代理类在客户端和实现端传递数据。

1.创建.aidl文件

package lyz.com.aidl;
import lyz.com.aidl.Person;
interface IMyService{
  void savePersonInfo(in Person person);
  List<Person> getAllPerson();
  String sayHello();
}

2.创建一个Person.aidl文件,注意这里是小写

package lyz.com.aidl;
parcelable Person;

3. 因为这里用到了Peson对象,所以要创建一个Person类。Person类,是一个序列化的类,这里使用Parcelable 接口来序列化,是Android提供的一个比Serializable 效率更高的序列化类。

package lyz.com.aidl;

import android.os.Parcel;
import android.os.Parcelable;

public class Person implements Parcelable{
private String name;
private String telNum;
private int age;
public String getTelNum() {
return telNum;
}

public void setTelNum(String telNum) {
this.telNum = telNum;
}

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}

public int getAge() {
return age;
}

public void setAge(int age) {
this.age = age;
}

public Person(){

}
public Person(Parcel p){
name=p.readString();
telNum=p.readString();
age=p.readInt();
}
@Override
public void writeToParcel(Parcel dest, int flags) {
// TODO Auto-generated method stub
dest.writeString(name);
dest.writeString(telNum);
dest.writeInt(age);
}

public static final Parcelable.Creator<Person> CREATOR=new Parcelable.Creator<Person>() {

@Override
public Person createFromParcel(Parcel source) {
// TODO Auto-generated method stub
return new Person(source);
}

@Override
public Person[] newArray(int size) {
// TODO Auto-generated method stub
return new Person[size];
}

};
@Override
public int describeContents() {
// TODO Auto-generated method stub
return 0;
}
}

4.上面的IMyService.aidl保存以后会在gen的相应目录下启动生成IMyService.java文件

5.我们就可以实现service里面的方法

package lyz.com.aidl;

import java.util.LinkedList;
import java.util.List;

import android.app.Service;
import android.content.Intent;
import android.os.IBinder;
import android.os.RemoteException;

public class RemoteService extends Service{
private LinkedList<Person> personList=new LinkedList<Person>();

private final IMyService.Stub mbinder=new IMyService.Stub() {

@Override
public String sayHello() throws RemoteException {
  return "欢迎你通过AIDL访问服务器端";
}

@Override
public void savePersonInfo(Person person) throws RemoteException {
  if(person!=null){
    personList.add(person);
  }
}

@Override
public List<Person> getAllPerson() throws RemoteException {
  return personList;
  }
};
@Override
public IBinder onBind(Intent intent) {
  return mbinder;
  }
}

至此服务端代码完成。客户端步骤如下:

 首先建立一个项目,把服务端的包和类一起拷贝到客户端项目中。因为客户端要和服务端通信,必须要使用同一个aidl。

 然后构造客户端的activity类,代码如下:

public class DemoAIDLActivity extends Activity {
private TextView tv;
private Button btsave,btget;
private IMyService myservice;
private static Boolean mIsRemoteBound=false;

private ServiceConnection conn=new ServiceConnection() {

@Override
public void onServiceDisconnected(ComponentName name) {
myservice=null;
}
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
myservice=IMyService.Stub.asInterface(service);
try {
tv.setText(myservice.sayHello());
} catch (RemoteException e) {
e.printStackTrace();
}

}
};
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
tv=(TextView) this.findViewById(R.id.tvshow);
btsave=(Button) findViewById(R.id.btsave);
btget=(Button) findViewById(R.id.btget);
if(mIsRemoteBound){
unbindService(conn);
}else{
Intent intent=new Intent("lyz.com.aidl.RemoteService");
bindService(intent, conn, BIND_AUTO_CREATE);
}
mIsRemoteBound=!mIsRemoteBound;
btsave.setOnClickListener(new OnClickListener() {

@Override
public void onClick(View v) {
Person p=new Person();
p.setName("lyz");
p.setAge(22);
p.setTelNum("123456");
try {
myservice.savePersonInfo(p);
} catch (RemoteException e) {
e.printStackTrace();
}
}
});
btget.setOnClickListener(new OnClickListener() {

@Override
public void onClick(View v) {
List<Person> list=null;
try {
list=myservice.getAllPerson();
} catch (RemoteException e) {
e.printStackTrace();
}
if(list!=null){
StringBuilder text=new StringBuilder();
for(Person p:list){
text.append("姓名:"+p.getName()+"\n年龄:"+p.getAge()+"\n电话:"+p.getTelNum());
}
btget.setText(text);
}else{
Toast.makeText(DemoAIDLActivity.this, "得到数据出错", Toast.LENGTH_LONG).show();
}
}
});
}
}

最后,不要忘记注册Service:

<service android:name=".RemoteService">
<intent-filter >
<action android:name="lyz.com.aidl.RemoteService"/>
</intent-filter>
</service>

 

 

 

 

 

原文地址:https://www.cnblogs.com/lyz459/p/2586546.html