今天测试aidl小demo
报错
Android\Sdk\build-tools\28.0.2\aidl.exe'' finished with non-zero exit value
原因: 传递的Ben对象 在aidl 文件中需要手动导入。
==============================================================================
Android studio aidl 进程通信
===============================================================================
服务端--客服端
服务端
创建传递对象ben 必须实现Parcelable
package com.example.servers; import android.os.Parcel; import android.os.Parcelable; public class Student implements Parcelable { private int id; private String name; public Student(int id, String name) { this.id=id; this.name=name; } public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } @Override public int describeContents() { return 0; } /** * 将当前的对象的属性数据进行打包 * @param dest * @param flags */ @Override public void writeToParcel(Parcel dest, int flags) { dest.writeInt(id); dest.writeString(name); } /** * 解包的方法 */ public static final Creator<Student> CREATOR= new Creator<Student>() { @Override public Student createFromParcel(Parcel source) { int id = source.readInt(); String name = source.readString(); return new Student(id,name); } /** * 返回指定大小的容器 * @param size * @return */ @Override public Student[] newArray(int size) { return new Student[size]; } }; }
创建aidl 同时在aidl目录下创与ben对象同名的aidl ( Student.aidl)
package com.example.servers;
import com.example.servers.Student;//需要手动复制javaBen对象的路径
// 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.
*/
Student getStudent(int id);
}
创建服务 返回Mys对象
public class MyRoteServers extends Service { @Override public IBinder onBind(Intent intent) { return new Mys(); } class Mys extends IMyAidlInterface.Stub{ @Override public Student getStudent(int id) throws RemoteException { return new Student(id,"zhangsan"); } } }
==================================
客户端
绑定远程服务 复制在服务端生成的aidl相关文件 不能修改包名 红色的部分需要复制到客户端
怎么复制
/**
* 绑定远程服务
* @param view
*/
public void pay(View view) {
// Toast.makeText(this, "--", Toast.LENGTH_SHORT).show();
Intent intent = new Intent("mynames");
intent.setPackage("com.example.servers");
//bindService方法在5.0以后做出改变,隐式意图需要设置Package 或者 Commponent,直接定义一个action是报
if(con==null){
con=new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
iMyAidlInterface = IMyAidlInterface.Stub.asInterface(service);
}
@Override
public void onServiceDisconnected(ComponentName name) {
}
};
Toast.makeText(this, "绑定成功", Toast.LENGTH_SHORT).show();
}else{
Toast.makeText(this, "已经绑定", Toast.LENGTH_SHORT).show();
}
bindService(intent, con, BIND_AUTO_CREATE);
}