之前一直没时间去看这个东西,今天抽时间脑补一下。
AIDL(Android Interface Definition Language)是Android系统自定义的接口描述语言。可以用来实现进程间的通讯。
服务端
一般用来处理客户端的请求,他把与客户端通讯的方式抽象成接口,并编写成 AIDL 文件。
通常服务端需要实现一个 Service,来处理客户端的请求
客户端
通常我们需要将服务端 的 AIDL 文件 copy 过来,并通过 Intent 的方式来启动我们服务端的 Service。
一般来说, AIDL 文件支持以下类型
Java 编程语言中的所有原语类型(如 int、long、char、boolean 等等)
String
CharSequence
List
List 中的所有元素都必须是以上列表中支持的数据类型、其他 AIDL 生成的接口或您声明的可打包类型。 可选择将 List 用作“通用”类(例如,List)。另一端实际接收的具体类始终是 ArrayList,但生成的方法使用的是 List 接口。
Map,必须是支持的数据类型。
具体使用方法,
在程序中定义一个实体类Person,Person实现Parcelable;
package test.demo.aidl.aerors.aidlapplationtest.bean;
import android.os.Parcel;
import android.os.Parcelable;
/**
* 项目名称 test.demo.aidl.aerors.aidlapplationtest.bean
* SJK
* 创建时间 2018/11/13 15:24
*/
public class Personimplements Parcelable {
private StringmName;
public Person(String name) {
this.mName = name;
}
protected Person(Parcel in) {
mName = in.readString();
}
public static final CreatorCREATOR =new Creator() {
@Override
public Person createFromParcel(Parcel in) {
return new Person(in);
}
@Override
public Person[] newArray(int size) {
return new Person[size];
}
};
@Override
public int describeContents() {
return 0;
}
@Override
public void writeToParcel(Parcel parcel,int i) {
parcel.writeString(mName);
}
@Override
public String toString() {
return "Person{" +
"name='" +mName +'\'' +
'}';
}
}
编写服务器端代码,在main下创建aidl
创建的aidl文件和java在同级目录,Person.aiddl包与实体类Person.java一致,并通过手动导入包;
// Person.aidl
package test.demo.aidl.aerors.aidlapplationtest.bean;
//之前导包导错了(test.demo.aidl.aerors.aidlapplationtest)一直报错,之后换成了(test.demo.aidl.aerors.aidlapplationtest.bean)
// Declare any non-default types here with import statements
import test.demo.aidl.aerors.aidlapplationtest.bean.Person;
parcelable Person ;
之前一直出现问题,导入的包不对
编写服务类IMyAidlInterface
package test.demo.aidl.aerors.aidlapplationtest;
import test.demo.aidl.aerors.aidlapplationtest.bean.Person;
// Declare any non-default types here with import statements
interface IMyAidlInterface {
/**
* Demonstrates some basic types that you can use as parameters
* and return values in AIDL.
*/
void addPerson(in Person person);
List getPersonList();
}
对项目进行rebuild,会自动生成
定义Service
package test.demo.aidl.aerors.aidlapplationtest;
import android.app.Service;
import android.content.Intent;
import android.os.IBinder;
import android.os.RemoteException;
import java.util.ArrayList;
import java.util.List;
import test.demo.aidl.aerors.aidlapplationtest.bean.Person;
public class MyAidlServiceextends Service {
private final StringTAG =this.getClass().getSimpleName();
public MyAidlService() {
}
private ListmPersonList;
private IBindermIBinder =new IMyAidlInterface.Stub() {
@Override
public void addPerson(Person person)throws RemoteException {
mPersonList.add(person);
}
@Override
public List getPersonList()throws RemoteException {
return mPersonList;
}
};
@Override
public IBinder onBind(Intent intent) {
// TODO: Return the communication channel to the service.
mPersonList =new ArrayList<>();
return mIBinder;
}
}
在Activity,中
package test.demo.aidl.aerors.aidlapplationtest;
import android.content.ComponentName;
import android.content.Intent;
import android.content.ServiceConnection;
import android.os.IBinder;
import android.os.RemoteException;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import java.sql.Connection;
import java.util.List;
import java.util.Random;
import test.demo.aidl.aerors.aidlapplationtest.bean.Person;
public class MainActivityextends AppCompatActivity {
private TextViewtvPerson;
private ButtonbtnAdd;
private IMyAidlInterfaceiMyAidlInterface;
private ServiceConnectionmConnection =new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
iMyAidlInterface = IMyAidlInterface.Stub.asInterface(service);
}
@Override
public void onServiceDisconnected(ComponentName name) {
iMyAidlInterface =null;
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Intent intent1 =new Intent(getApplicationContext(), MyAidlService.class);
bindService(intent1,mConnection,BIND_AUTO_CREATE);
tvPerson = findViewById(R.id.tv_person);
btnAdd = findViewById(R.id.btn_Add);
btnAdd.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Random random =new Random();
Person person =new Person("shanxi" + random.nextInt(10));
try {
iMyAidlInterface.addPerson(person);
List personList =iMyAidlInterface.getPersonList();
tvPerson.setText(personList.toString());
}catch (RemoteException e) {
e.printStackTrace();
}
}
});
}
}