【GT-Android开发之AIDL用法】

前言:在前面的文章中,我提到了一个银联商务“U架构的”的概念,其实现原理便涉及到了今天的主角——AIDL,可能大多数人对于这个名词都不陌生。所谓AIDL,即Android Interface Definition Language(安卓接口定义语言),它是安卓进程间通信的一种方式。

    之前提过的“U架构”,便是利用AIDL技术定义了一系列的服务接口,客户端通过调用接口来实现相应的功能。一般的AIDL程序是由两部分组成,分别是服务端与客户端,与网络通信中的概念类似,服务端定义了很多业务逻辑接口,客户端可以调用。“U架构”要求一套应用在各厂商的设备终端上完美运行,为了解决硬件差异,需要各个厂商来维护自己的服务端。这样只要保证接口一致,各个厂商设备的应用便可完美适配。

    AIDL如何使用呢?接下来通过一个简单的开关手电筒程序来熟悉这一技术。。。

    第一步,服务端定义接口

    在自定义包下新建一个.aidl文件,里面定义一个接口Interface并定义另个函数,分别是开灯与关灯,代码如下:

    // IRemoteService.aidl
    package com.example.aidltest;
 
    // Declare any non-default types here with import statements
 
    /** Example service interface */
    interface IRemoteService {
        int openLight();
        int closeLight();

    }

    第二步,服务端接口实现

    服务端定义一个Service,构造一个IRemoteService.Stub对象mBinder,IRemoteService与上一步定义的aidl文件同名,新建之后会有错误提示,实现未完成的方法便可,然后编写开灯和关灯的逻辑代码

    第三步,将aidl文件复制到客户端

    这一步需要注意aidl文件需要放在跟服务端同名的包下

    第四步,客户端调用接口

    客户端定义IRemoteService全局对象,并定义一个ServiceConnection,IRemoteService.Stub.asInterface(service);

上一句代码执行之后,便可直接调用aidl定义的方法。

    附:

    绑定服务代码:Intent intent = new Intent("com.example.aidltest.tgt.aidl");

        bindService(intent, conn1, Context.BIND_AUTO_CREATE);

    定义ServiceConnection:ServiceConnection conn1 = new ServiceConnection() {
        
        @Override
        public void onServiceDisconnected(ComponentName name) {
        }
         
        @Override
        public void onServiceConnected(ComponentName name, IBinder service) {
            remoteService = IRemoteService.Stub.asInterface(service);
            System.out.println("bind success! " + remoteService.toString());
        }

    };

    调用开灯方法:remoteService.openLight();

    


猜你喜欢

转载自blog.csdn.net/qq_17433217/article/details/80983672