美文网首页
AIDL的使用

AIDL的使用

作者: 旺仔_100 | 来源:发表于2021-02-13 12:24 被阅读0次

    一、创建一个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}
    

    相关文章

      网友评论

          本文标题:AIDL的使用

          本文链接:https://www.haomeiwen.com/subject/oeysxltx.html