概述

AIDL:Android Interface Definition Language,即Android接口定义语言,记住,它是一门语言,设计它的目的就是为了实现跨进程通信,我们知道Android的每一个进程都运行在独立的内存中,进程之间代码是不能愉快的调用的,但是在我们开发中难免会有一些场景是需要实时进行进程间方法调用和数据传递。

AIDL支持的数据类型

  • JAVA的基本数据类型(byte、short、int、long、float、double、boolean、char)

  • String和Charsequence

  • List,只支持ArrayList,其中的对象必须序列化

  • Map、只支持HashMap,其中对象必须序列化

  • 实现android.os.Parcelable 接口的对象

  • AIDL自动生成的接口

AIDL实现步骤

第一步:创建工程

由于AIDL是进程间通信,所以先要定义两个工程,我们定义为:
客户端:AIDLClientDmeo
服务端:AIDLServerDmeo (服务端需要实现Service服务)

创建工程很简单,这里忽略这个过程;

第二步:定义AIDL接口

Android跨进程通信AIDL详解(附源码)_第1张图片

通过Android Studio创建一个以.aidl结尾的文件,为了实现2个进程能相互调用,定义2个aidl:IFirstAidlInterface.aidl和ICallbackInterface.aidl

    package com.ailian.study;    interface IServerListener {       void backByServer(String param);    }    package com.ailian.study;    import com.ailian.study.IServerListener;//注意这边需要手动引入    interface IFirstAidlInterface {        void callServer(String type,IServerListener callback);    }

定义AIDL接口注意点:

  • AIDL接口在相互通信的两个进程都要定义,而且文件路径和文件名都需要一致,这一点很重要,否则将无法进行通信;
    Android跨进程通信AIDL详解(附源码)_第2张图片

第三步:编译

在定义完AIDL接口后,需要先编译工程,因为在编译后IDE会自动为我们在app/build/generated/source/aidl/debug/目录生成同名的JAVA文件,不需要关注这个文件是如何生成的,自动生成的文件是readOnly的不可以修改,我们这里不解释里面生成的内容;
Android跨进程通信AIDL详解(附源码)_第3张图片

第四步:AIDLServerDmeo实现Service

上面步骤中我们已经在2个工程中都定义好了AIDL接口,现在可以在Server端实现Service,并暴露出来让其他进程bind;

    package com.ailian.study.aidlserverdemo;    import android.app.Service;    import android.content.Intent;    import android.os.IBinder;    /**     * Created by ailian on 2018/6/9/009.     */    public class AidlService extends Service {        private AidlServiceSub mServiceStub;        @Override        public void onCreate() {            super.onCreate();            mServiceStub = new AidlServiceSub();        }        @Override        public IBinder onBind(Intent intent) {            /**             * 这里会返回一个binder对象,在Client获取到这个对象             */            return mServiceStub;        }        @Override        public boolean onUnbind(Intent intent) {            return super.onUnbind(intent);        }    }

onBind方法中有个返回值IBinder对象,Client通过bindService通过接口可以获取到这个IBinder对象,AidlServiceSub需要继承IFirstAidlInterface自动生成的IFirstAidlInterface.Stub对象:

    package com.ailian.study.aidlserverdemo;    import android.os.RemoteException;    import android.util.Log;    import com.ailian.study.IFirstAidlInterface;    import com.ailian.study.IServerListener;    /**     * Created by ailian on 2018/6/9/330.     */    public class AidlServiceSub extends IFirstAidlInterface.Stub {        @Override        public void callServer(String type, IServerListener callback) throws RemoteException {            Log.d("AidlServiceSub", "Client发过来的信息:" + type);            callback.backByServer("黄河黄河,我也是黄河");        }    }

第五步:AIDLServerDmeo实现Service

在AIDLServerDemo的AndroidManifest.xml中声明第四步创建的Service

android:exported=”true” //运行其他APP启动

android:process=”:remote”//运行在单独的进程

//需要自定义一个action其他进程启动该服务就通过这个aciton:

    <service        android:name=".AidlService"        android:exported="true"        android:process=":remote">        <intent-filter>            <action android:name="android.ailian.aidl.test" />            <category android:name="android.intent.category.DEFAULT" />        intent-filter>    service>

第六步:AIDLClientDmeo启动Service

上面的五步后,Client端就可以通过bindService与Server端建立通信通道了:

    Intent it = new Intent();    it.setAction("android.ailian.aidl.test");    it.setPackage("com.ailian.study.aidlserverdemo");    bindService(it, mserviceConnection, BIND_AUTO_CREATE);

这里有个mserviceConnection,是调用bindService的一个回调

    ServiceConnection mserviceConnection = new ServiceConnection() {        @Override        public void onServiceDisconnected(ComponentName name) {            /**             * 绑定失败的回调             */            bindServiceTip.setText("服务绑定失败,请重新绑定");            clientContent.setText("");        }        @Override        public void onServiceConnected(ComponentName name, IBinder service) {            /**             * 绑定成功的回调,这里获取到了IBinder对象,我们就是通过这个IBinder实现与Server进行通信             */            bindServiceTip.setText("服务绑定成功,可以通信了");            clientContent.setText("");            executeService = IFirstAidlInterface.Stub.asInterface(service);        }    };

搞定啦,我们来测试一下吧

验证结果

我们将2个APP同时安装在同一台手机中

Android跨进程通信AIDL详解(附源码)_第4张图片

通过手机直接测试,测试成功可以相互通信;

没有源码的步骤讲解都是耍流氓

Android跨进程通信AIDL详解(附源码)_第5张图片

附上源码下载地址,希望对您有所帮助:

https://download.csdn.net/download/huo108/10469143

更多相关文章

  1. Android自定义View(自定义控件)
  2. 【Appetite】ionic3实录(四)微调Segment,并引出自定义组件概念
  3. 基于WebSocket的Android与服务端通信
  4. AIDL实现进程间通信
  5. Android之网络通信
  6. Android中通过Messenger与Service实现进程间双向通信

随机推荐

  1. android 之 布局属性--RelativeLayout
  2. android保存图片到sdcard后,在图片浏览器
  3. Intent常用Uri,打开相应的应用
  4. Ubuntu18.04配置ADB调试环境
  5. Android应用程序组件Content Provider在
  6. 让背景小图不是拉伸而是多个重复
  7. Android自动提示--AutoCompleteTextView
  8. Android(安卓)P Camera架构
  9. cocos2d js 3.0window下配置笔记
  10. 获得a meta-data 的值