安卓使用AIDL进程跨进程通信

1、创建AIDL文件夹及文件,点击app > New > AIDL > AIDL File

2、将IMyAidlInterface删除后,在AIDL包内(该包文件夹结构与项目文件夹结构相同)创建Student.aidl和StudentManager.aidl

3、编写Student.java,因为要该类的数据要跨进程传输所以要实现Parcelable接口。


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

public class Student implements Parcelable {
    public int studentNumber;
    public String studentName;


    public Student(int studentNumber, String studentName) {
        this.studentNumber = studentNumber;
        this.studentName = studentName;
    }

    public Student(Parcel source) {
        studentNumber = source.readInt();
        studentName = source.readString();
    }

    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];
        }
    };


    @Override
    public int describeContents() {
        return 0;
    }

    @Override
    public void writeToParcel(Parcel dest, int flags) {
        dest.writeInt(studentNumber);
        dest.writeString(studentName);
    }


    @Override
    public String toString() {
        return "Student :" +
                "studentNumber=" + studentNumber +
                ", studentName='" + studentName + '\'';
    }
}

4、编写Student.aidl,AIDL中每个实现了Parcelable接口的类都要创建相应的文件并将该类声明为Parcelable。要手动加入完整包名。

4、编写StudentManager.aidl,声明一些操作数据的方法,in表示为输入型参数,out表示输出型参数,inout表示输入输出型参数。

5、Rebuild project,将文件浏览模式切换为“Android”,如果在java(generated)目录下看得到自动生成的文件的话,说明AIDL文件创建成功。

6、编写服务端,BookManagerService.java


public class BookManagerService extends Service {
    private static final String TAG = "BookManagerService";
//    CopyOnWriteArrayList支持并发读写,自动进行线程同步
    private CopyOnWriteArrayList<Student> mStudentList = new CopyOnWriteArrayList();

//    Binder对象用来与客户端通信
    private Binder mBinder = new StudentManager.Stub() {
        @Override
        public List<Student> getStudentList() throws RemoteException {
            return mStudentList;
        }

        @Override
        public boolean addStudent(Student student) throws RemoteException {
            return mStudentList.add(student);
        }
    };

    @Override
    public void onCreate() {
        super.onCreate();
        mStudentList.add(new Student(1000,"凌某"));
        mStudentList.add(new Student(1002,"刘某"));
    }
// 会将Binder对象返回给客户端
    @Nullable
    @Override
    public IBinder onBind(Intent intent) {
        return mBinder;
    }
}

7、编写客户端,AidlActivity.java

package com.example.interview2.ipc.aidl;

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.util.Log;
import android.view.View;

import androidx.appcompat.app.AppCompatActivity;

import com.example.interview2.Student;
import com.example.interview2.R;
import com.example.interview2.StudentManager;

import java.util.List;

public class AidlActivity extends AppCompatActivity {

    private static final String TAG = "AidlActivity";
    
    private StudentManager studentManager;

//    ServiceConnection对象用以和服务端建立连接
    private ServiceConnection mConnection = new ServiceConnection() {
        @Override
        public void onServiceConnected(ComponentName name, IBinder service) {
//            将Binder对象转换成服务端的StudentManager对象,用以远程调用方法。
            studentManager = StudentManager.Stub.asInterface(service);

            try {
                List<Student> list = studentManager.getStudentList();
                Log.d(TAG, "onServiceConnected: query book list, list type is"+list.getClass().getCanonicalName());

                Log.d(TAG, "onServiceConnected: query book list : "+list.toString());
            } catch (RemoteException e) {
                e.printStackTrace();
            }
        }

        @Override
        public void onServiceDisconnected(ComponentName name) {
            studentManager=null;
        }
    };



    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
//        启动服务端
        Intent intent = new Intent(this, BookManagerService.class);
        bindService(intent,mConnection,Context.BIND_AUTO_CREATE);
    }


    @Override
    protected void onDestroy() {
        unbindService(mConnection);
        super.onDestroy();
    }
//      测试添加数据
    public void onClick(View v) {
        try {
            Student student = new Student(1003, "廖某");
            boolean b = studentManager.addStudent(student);
            if (b) {
                List<Student> list = studentManager.getStudentList();
                Log.d(TAG, "onServiceConnected: query student list, list type is"+list.toString());
            }
        }catch (Exception e){

        }
    }
}

8、在AndroidManifest.xml中添加BookManagerService

<service
            android:name=".ipc.aidl.BookManagerService"
            android:process=":remote2">
</service>
发布了2 篇原创文章 · 获赞 2 · 访问量 1076

猜你喜欢

转载自blog.csdn.net/Eridike/article/details/104026049
今日推荐