android studio aidl用法详解

在我们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、此时你再运行应该就不会出问题了。
总结:
   以上是我个人开发的方式,如果能帮到大家是我的荣幸,如果大家不喜欢请忽略。


展开阅读全文

没有更多推荐了,返回首页