废话不多说,直接上代码,首先是目录
在app里面定义aidl和Student类,然后把这两个完全复制到btestsetvice里面,注意包名也要相同
然后就是Student这个类了,这个类需要实现Parcelable接口
public class Student implements Parcelable { public int id; public String name; public Student(int id, String name) { this.id = id; this.name = name; } @Override public int describeContents() { return 0; } //此方法需要将成员按顺序写入 @Override public void writeToParcel(Parcel dest, int flags) { dest.writeInt(id); dest.writeString(name); } @Override public String toString() { return "Student{" + "id=" + id + ", name='" + name + '\'' + '}'; } public static final Parcelable.Creator<Student> CREATOR = new ClassLoaderCreator<Student>() { @Override public Student createFromParcel(Parcel source, ClassLoader loader) { return null; } //此方法需要将成员按顺序读出并写入 @Override public Student createFromParcel(Parcel source) { int id = source.readInt(); String name = source.readString(); Student student = new Student(id, name); return student; } @Override public Student[] newArray(int size) { return new Student[size]; } }; }然后定义两个Aidl
1 Aaidl.aidl
package com.example.venn.aidltransclass; import com.example.venn.aidltransclass.Student; // Declare any non-default types here with import statements interface AAidl { /** * Demonstrates some basic types that you can use as parameters * and return values in AIDL. */ Student transClass(); }这里的package和import必须加,
2 Student.aidl
package com.example.venn.aidltransclass; parcelable Student; 这里的package必须加,否则报错,然后就是Servicepublic class AService extends Service { public AService() { } @Override public IBinder onBind(Intent intent) { // TODO: Return the communication channel to the service. return aidl; } @Override public void onCreate() { super.onCreate(); Log.d("student", "onCreate"); } public AAidl.Stub aidl = new AAidl.Stub() { @Override public Student transClass() throws RemoteException { Student student = new Student(20, "Tom"); return student; } }; }最后就是客户端的activity,public class MainActivity extends Activity implements ServiceConnection { private AAidl mAidl; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); //Android 5.0之后只能通过这种方式绑定服务 Intent intent = new Intent(); intent.setAction("com.service.Aservice"); intent.setPackage("com.example.venn.aidltransclass"); bindService(intent, this, BIND_AUTO_CREATE); } @Override public void onServiceConnected(ComponentName name, IBinder service) { Log.d("student", "onServiceConnected"); mAidl = AAidl.Stub.asInterface(service); try { Student student = mAidl.transClass(); Log.d("student", student.toString()); } catch (RemoteException e) { e.printStackTrace(); } } @Override public void onServiceDisconnected(ComponentName name) { } }服务端的清单文件<service android:name=".AService" android:enabled="true" android:exported="true" > <intent-filter> <action android:name="com.service.Aservice"/> </intent-filter> </service> 必须加action,用在intent.setAction里面 运行结果 两个Moudle,一个app,一个btestservice,在app内定义一个服务,在btestservice的MainActivity里面绑定,然后打印出 绑定的服务里面的对象