一、创建一个AIDIService作为服务端项目。
1.正常的创建一个Person类,这个Person是我们通信要用到的类。
不要忘记实现Parcelable
package com.example.aidlservice;
import android.os.Parcel;
import android.os.Parcelable;
public class Person implements Parcelable {
private String name;
private int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
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;
}
@Override
public int describeContents() {
return 0;
}
@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeString(this.name);
dest.writeInt(this.age);
}
protected Person(Parcel in) {
this.name = in.readString();
this.age = in.readInt();
}
public static final Parcelable.Creator<Person> CREATOR = new Parcelable.Creator<Person>() {
@Override
public Person createFromParcel(Parcel source) {
return new Person(source);
}
@Override
public Person[] newArray(int size) {
return new Person[size];
}
};
}
2.在跟java文件夹同层级创建一个aidl的文件,并创建一个Person.aidl文件来声明Person类。
package com.example.aidlservice;
parcelable Person;
3.创建自己的AIDL声明需要的接口MyAIDL.aidl。
注意:需要把上面的Person.aidl导包在本类中。
// MyAIDL.aidl
package com.example.aidlservice;
// Declare any non-default types here with import statements
import com.example.aidlservice.Person;
interface MyAIDL {
/**
* Demonstrates some basic types that you can use as parameters
* and return values in AIDL.
*/
void getPerson(in Person person);
List<Person> getList();
}
4.项目结构如下

5.创建一个AIDLServic。
注意:MyAIDL这个类找不到,需要先make Project一下,也就是Android Studio工具栏的小锤子🔨 它会生成一个MyAIDL类。
package com.example.aidlservice;
import android.app.Service;
import android.content.Intent;
import android.os.IBinder;
import android.os.RemoteException;
import java.util.ArrayList;
import java.util.List;
public class AIDLService extends Service {
private List<Person> personList ;
public AIDLService() {
}
@Override
public void onCreate() {
super.onCreate();
personList = new ArrayList<>();
}
@Override
public IBinder onBind(Intent intent) {
System.out.println("AIDLService 已经被绑定");
return iBinder;
}
private IBinder iBinder = new MyAIDL.Stub(){
@Override
public void getPerson(Person person) throws RemoteException {
personList.add(person);
}
@Override
public List<Person> getList() throws RemoteException {
return personList;
}
};
}
6.客户端调用服务端的service是通过包名和对应的action,所以在服务端需要给Service添加一个action,如下:
<service
android:name=".AIDLService"
android:enabled="true"
android:exported="true">
<intent-filter>
<action android:name="MyAIDLService"/>
<category android:name="android.intent.category.DEFAULT"/>
</intent-filter>
</service>
到此服务度的代码就完成,可以运行一下。
二、新创建一个客户端的项目AIDLClient。
1.把服务端整个aidl文件夹都复制到客户端
2.把服务端的Person.java类复制到客户端,并保持和服务端相同的包名和层级。
3.make Project一下,看有没有生成MyAIDL类,可以在MainActivity里面写MyAIDL,是否能跳转到MyAIDL代码里面。如果MainActivity里面找不到检查上面的1.2两个步骤。
4.在MainActivity里面启动Service,并通过Binder获取对应的MyAIDL对象。代码如下:
package com.example.aidlclient;
import androidx.appcompat.app.AppCompatActivity;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.ServiceConnection;
import android.os.Bundle;
import android.os.IBinder;
import android.os.RemoteException;
import android.view.View;
import android.widget.TextView;
import com.example.aidlservice.MyAIDL;
import com.example.aidlservice.Person;
public class MainActivity extends AppCompatActivity {
private MyAIDL myAIDL;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
TextView tv = findViewById(R.id.tv);
tv.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if(isConnected){
try {
myAIDL.getPerson(new Person("ao",18));
for (Person person : myAIDL.getList()) {
System.out.println(person.toString());
}
} catch (RemoteException e) {
e.printStackTrace();
}
}
}
});
bindMyService();
}
private boolean isConnected;
private ServiceConnection serviceConnection = new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
System.out.println("serviceConnection success");
myAIDL = MyAIDL.Stub.asInterface(service);
isConnected = true;
}
@Override
public void onServiceDisconnected(ComponentName name) {
System.out.println("serviceConnection failed");
isConnected = false;
}
};
private void bindMyService(){
Intent intent = new Intent();
intent.setPackage("com.example.aidlservice");
intent.setAction("MyAIDLService");
bindService(intent,serviceConnection, Context.BIND_AUTO_CREATE);
}
}
5.先启动服务端之后,在启动客户端,就可以看到如下打印
2021-02-13 11:47:05.320 5417-5417/com.example.aidlclient I/System.out: Person{name='ao', age=18}
网友评论