Android studio 下AIDL使用

AIDL是android app进行进程间通信的一种简单方法,本文正对在Android studio下建立AIDL通信遇到的问题以及一些细节做一下介绍。
1,Server的处理
(1)建立AIDL文件,在Android Studio下只要在根目录建aidl文件就会自动在main目录下建一个与java文件相同的包,新建的aidl文件就在这个目录下。
(2)建完aidl文件,rebuild项目,就会自动生成一个和aidl文件名字相同的接口文件。
(3)新建service,service的内部类实现编译生成的接口:

public class MyService extends Service {
    public MyService() {
    }

    @Override
    public IBinder onBind(Intent intent) {
        // TODO: Return the communication channel to the service.
        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 {

        }

        @Override
        public String getName(MyParcelable p) throws RemoteException {
            return p.getmData() + "";
        }
    }

}
  (4)修改build.gradle文件,添加如下代码:
 main {
            manifest.srcFile 'src/main/AndroidManifest.xml'
            java.srcDirs = ['src/main/java', 'src/main/aidl']
            resources.srcDirs = ['src/main/java', 'src/main/aidl']
            aidl.srcDirs = ['src/main/aidl']
            res.srcDirs = ['src/main/res']
            assets.srcDirs = ['src/main/assets']
        }

2,客户端处理
(1)直接将server端的aidl文件复制到客户端,注意保持文件目录相同,以下是截取的server目录截图:

Android studio 下AIDL使用_第1张图片
image.png

接着是客户端截图

Android studio 下AIDL使用_第2张图片
image.png

(2)调用远程service
这一步主要是建立Service连接,代码如下:

getActivity().bindService(new Intent("com.test.server"), new ServiceConnection() {
            @Override
            public void onServiceConnected(ComponentName name, IBinder service) {
                iMyAidlInterface = IMyAidlInterface.Stub.asInterface(service);
            }

            @Override
            public void onServiceDisconnected(ComponentName name) {

            }
        }, Context.BIND_AUTO_CREATE);

获取到Service对象之后,就可以进行远程Service远程调用了。

3,自定义数据类型
AIDL提供的基本数据类型和list,map如果要使用自定义的数据类型则需要进行以下几步:
(1)自定义java类,并且实现Parcelable接口。
(2)在aidl文件夹下,新建一个和自定义类名相同的aidl文件,

package server.test.com.server;

parcelable MyParcelable;
 (3)引用这个aidl类型,注意要手动导包,即使在同一个目录下。
package server.test.com.server;
import server.test.com.server.MyParcelable;
// Declare any non-default types here with import statements
interface IMyAidlInterface {
    /**
     * Demonstrates some basic types that you can use as parameters
     * and return values in AIDL.
     */
    void basicTypes(int anInt, long aLong, boolean aBoolean, float aFloat,
            double aDouble, String aString);
    String getName(in MyParcelable p);
}
 这里要说明一下,接收的数据类型前面要加上in,或者out,或者inout,in表示的是客户端输入的数据,out表示的是服务端输出数据,inout表示即可以输入也可以输出。
 (4)复制aidl文件和java文件到客户端相应位置,保持包名相同,然后就可以调用了。

你可能感兴趣的:(Android studio 下AIDL使用)