您的位置:首页 > 移动开发 > Android开发

android studio aidl用法详解

2016-07-07 09:45 615 查看
在我们android开发中经常会遇到进程间通信,android提供了一种解决方案就是aidl,下面我来介绍一下如何在android studio中实现aidl。1、在android studio中创建一个工程2、创建两个module  比如我的: aidlserver  和  aidlclient这样就能实现两个进程了。3、在aidlserver中的创建aidl文件见下图            4、在你新建的aidl中声明你的服务方法5、在java/pakagename下创建service(别忘了在mainfest中声明你的service)
public class MyService extends Service{
@Nullable
@Override
public IBinder onBind(Intent intent) {
return new MyBinder();
}

class MyBinder extends IMyAidlInterface.Stub{

@Override
public void basicTypes(int anInt, long aLong, boolean aBoolean, float aFloat, double aDouble, String aString) throws RemoteException {
System.out.println("get data from client:" + anInt + " " + aLong);
}

@Override
public void sendObj(Student student) throws RemoteException {
System.out.println("xixixixiixiixi");
}
}
}
6、将你的aidl包,直接copy到aidlclient中(客户端的aidl包必须和服务端一致,否则会序列化失败,无法bindservice)
7、实现客户端和服务端的绑定代码     
public class MainActivity extends AppCompatActivity {
private IMyAidlInterface aidlService;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}

@Override
protected void onResume() {
super.onResume();
Intent intent = new Intent();
intent.setAction("cn.com.callServer");
bindService(intent, new MyConnection(), BIND_AUTO_CREATE);
}

public void callService(View view) {
try {
aidlService.basicTypes(15, 123, true, 887.3f, 563.5, "hello");
Student student = new Student();
student.setAge(12);
student.setName("nihao");
aidlService.sendObj(student);
} catch (RemoteException e) {
e.printStackTrace();
}
}

class MyConnection implements ServiceConnection {
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
aidlService = IMyAidlInterface.Stub.asInterface(service);
}

@Override
public void onServiceDisconnected(ComponentName name) {

}
}
}
8、可以试着运行一下aidlserver和aidlclient,没有意外aidlclient可以成功调用aidlserver中的方法了。
注:大家有没有发现上面还有一个接口用到了Sudent类,对了下面我再重点介绍一下自定义对象如何在aidl中使用。
1、首先在aidlserver的aidl包中创建Student类(为什么放到这里,这样你就可以直接把aidl包发给客户端了省去了手动copy的麻烦)
Student一定要实现Parcelable接口,下面是我创建的Student对象
public class Student implements Parcelable{private String name;private String telNumber;private int age;public Student() {}public Student(Parcel pl){name = pl.readString();telNumber = pl.readString();age = pl.readInt();}public String getName() {return name;}public void setName(String name) {this.name = name;}public String getTelNumber() {return telNumber;}public void setTelNumber(String telNumber) {this.telNumber = telNumber;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}@Overridepublic int describeContents() {return 0;}@Overridepublic void writeToParcel(Parcel dest, int flags) {dest.writeString(name);dest.writeString(telNumber);dest.writeInt(age);}public static final Creator<Student> CREATOR = new Creator<Student>() {@Overridepublic Student createFromParcel(Parcel source) {return new Student(source);}@Overridepublic Student[] newArray(int size) {return new Student[size];}};}
2、在aidl的包下创建Student.aidl文件,下面是具体内容
  package com.example.aidlserver;  parcelable Student;
3、此时你去运行你的aidl会报错,log显示找不到Student的定义,没错现在你的Student在aidl包下,编译时不会去它下面找类,此时你需要做以下工作,在build.gradle文件中加入以下代码。同理你的aidlclient中也要加上。
   sourceSets{main{java.srcDirs = ['src/main/java', 'src/main/aidl']}}
4、此时你再运行应该就不会出问题了。
总结:
以上是我个人开发的方式,如果能帮到大家是我的荣幸,如果大家不喜欢请忽略。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: