android studio aidl用法详解

来源:互联网 发布:农村淘宝店怎么加盟 编辑:程序博客网 时间:2024/05/22 06:14

在我们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;    }    @Override    public int describeContents() {        return 0;    }    @Override    public void writeToParcel(Parcel dest, int flags) {        dest.writeString(name);        dest.writeString(telNumber);        dest.writeInt(age);    }    public static final Creator<Student> CREATOR = new Creator<Student>() {        @Override        public Student createFromParcel(Parcel source) {            return new Student(source);        }        @Override        public 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、此时你再运行应该就不会出问题了。
总结:
   以上是我个人开发的方式,如果能帮到大家是我的荣幸,如果大家不喜欢请忽略。


1 2
原创粉丝点击