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

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 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 175,738评论 25 709
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 135,642评论 19 139
  • Jianwei's blog 首页 分类 关于 归档 标签 巧用Android多进程,微信,微博等主流App都在用...
    justCode_阅读 11,190评论 1 23
  • Android跨进程通信IPC整体内容如下 1、Android跨进程通信IPC之1——Linux基础2、Andro...
    隔壁老李头阅读 13,685评论 13 43
  • 今天去上海溜达了 上午挤在闹哄哄的城隍庙,除了贵贵的南翔包子之外也没什么有意思的东西了 话说那里有现场刻章卖的,1...
    流星雨lxy阅读 2,454评论 3 0