AIDL的使用

2021-02-13  本文已影响0人  旺仔_100

一、创建一个AIDIService作为服务端项目。
1.正常的创建一个Person类,这个Person是我们通信要用到的类。
不要忘记实现Parcelable

package com.example.aidlservice;

import android.os.Parcel;
import android.os.Parcelable;

public class Person implements Parcelable {
    private String name;
    private int age;

    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    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(this.name);
        dest.writeInt(this.age);
    }

    protected Person(Parcel in) {
        this.name = in.readString();
        this.age = in.readInt();
    }

    public static final Parcelable.Creator<Person> CREATOR = new Parcelable.Creator<Person>() {
        @Override
        public Person createFromParcel(Parcel source) {
            return new Person(source);
        }

        @Override
        public Person[] newArray(int size) {
            return new Person[size];
        }
    };
}

2.在跟java文件夹同层级创建一个aidl的文件,并创建一个Person.aidl文件来声明Person类。

package com.example.aidlservice;

parcelable Person;

3.创建自己的AIDL声明需要的接口MyAIDL.aidl。
注意:需要把上面的Person.aidl导包在本类中。

// MyAIDL.aidl
package com.example.aidlservice;

// Declare any non-default types here with import statements
import com.example.aidlservice.Person;

interface MyAIDL {
    /**
     * Demonstrates some basic types that you can use as parameters
     * and return values in AIDL.
     */

            void getPerson(in Person person);
            List<Person> getList();
}

4.项目结构如下


AIDL图片.png

5.创建一个AIDLServic。
注意:MyAIDL这个类找不到,需要先make Project一下,也就是Android Studio工具栏的小锤子🔨 它会生成一个MyAIDL类。

package com.example.aidlservice;

import android.app.Service;
import android.content.Intent;
import android.os.IBinder;
import android.os.RemoteException;

import java.util.ArrayList;
import java.util.List;

public class AIDLService extends Service {

    private List<Person> personList ;
    public AIDLService() {
    }

    @Override
    public void onCreate() {
        super.onCreate();
        personList = new ArrayList<>();
    }

    @Override
    public IBinder onBind(Intent intent) {
        System.out.println("AIDLService 已经被绑定");
        return  iBinder;
    }

    private IBinder iBinder = new MyAIDL.Stub(){


        @Override
        public void getPerson(Person person) throws RemoteException {
            personList.add(person);
        }

        @Override
        public List<Person> getList() throws RemoteException {
            return personList;
        }
    };
}

6.客户端调用服务端的service是通过包名和对应的action,所以在服务端需要给Service添加一个action,如下:

   <service
            android:name=".AIDLService"
            android:enabled="true"
            android:exported="true">
            <intent-filter>
                <action android:name="MyAIDLService"/>
                <category android:name="android.intent.category.DEFAULT"/>
            </intent-filter>

        </service>

到此服务度的代码就完成,可以运行一下。

二、新创建一个客户端的项目AIDLClient。
1.把服务端整个aidl文件夹都复制到客户端
2.把服务端的Person.java类复制到客户端,并保持和服务端相同的包名和层级。
3.make Project一下,看有没有生成MyAIDL类,可以在MainActivity里面写MyAIDL,是否能跳转到MyAIDL代码里面。如果MainActivity里面找不到检查上面的1.2两个步骤。
4.在MainActivity里面启动Service,并通过Binder获取对应的MyAIDL对象。代码如下:

package com.example.aidlclient;

import androidx.appcompat.app.AppCompatActivity;

import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.ServiceConnection;
import android.os.Bundle;
import android.os.IBinder;
import android.os.RemoteException;
import android.view.View;
import android.widget.TextView;

import com.example.aidlservice.MyAIDL;
import com.example.aidlservice.Person;

public class MainActivity extends AppCompatActivity {

    private MyAIDL myAIDL;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        TextView tv = findViewById(R.id.tv);
        tv.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if(isConnected){
                    try {
                        myAIDL.getPerson(new Person("ao",18));
                        for (Person person : myAIDL.getList()) {
                            System.out.println(person.toString());
                        }

                    } catch (RemoteException e) {
                        e.printStackTrace();
                    }
                }
            }
        });

        bindMyService();
    }

    private boolean isConnected;

    private ServiceConnection serviceConnection = new ServiceConnection() {
        @Override
        public void onServiceConnected(ComponentName name, IBinder service) {
            System.out.println("serviceConnection success");
            myAIDL = MyAIDL.Stub.asInterface(service);
            isConnected = true;
        }

        @Override
        public void onServiceDisconnected(ComponentName name) {
            System.out.println("serviceConnection failed");
            isConnected = false;
        }
    };

    private void bindMyService(){
        Intent intent = new Intent();
        intent.setPackage("com.example.aidlservice");
        intent.setAction("MyAIDLService");
        bindService(intent,serviceConnection, Context.BIND_AUTO_CREATE);
    }
}

5.先启动服务端之后,在启动客户端,就可以看到如下打印

2021-02-13 11:47:05.320 5417-5417/com.example.aidlclient I/System.out: Person{name='ao', age=18}
上一篇下一篇

猜你喜欢

热点阅读