美文网首页
Android studio 下AIDL使用

Android studio 下AIDL使用

作者: SDY_0656 | 来源:发表于2017-09-07 16:13 被阅读0次

    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目录截图:

    image.png

    接着是客户端截图

    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使用

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