Android跨进程通信AIDL详解(附源码)

概述

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接口

image

通过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接口在相互通信的两个进程都要定义,而且文件路径和文件名都需要一致,这一点很重要,否则将无法进行通信;
    image

第三步:编译

在定义完AIDL接口后,需要先编译工程,因为在编译后IDE会自动为我们在app/build/generated/source/aidl/debug/目录生成同名的JAVA文件,不需要关注这个文件是如何生成的,自动生成的文件是readOnly的不可以修改,我们这里不解释里面生成的内容;
image

第四步: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同时安装在同一台手机中

image

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

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

image

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

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

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Android应用源码安卓源码(172个合集),可以做为你的学习参考。 365MobileSecretary v1.0.6(365手机助手AIDL) 888个经典 Logo.rar AdXmpp(Openfire+asmack+spark) .zip AidlDemo(简单aidl的例子) aidl进程调用.rar andbatdog电池监控.rar andbatdog监视电池.rar andricoFacebook客户端.rar Android Gamex分析报告.rar Android 英语单词记忆程序源码 AndroidPdfViewerPDF查看器.zip AndroidPlayer(仿酷狗播放器).tar androidtalk_2010_11_17【Sundy系列】全看懂了-加两年经验-语音朗读-语音识别-语音.rar Android下的信息客户端 WhisperSystems-TextSecure.zip Android与js交互.rar Android中监听电话状态.rar Android之Wifi学习教程.rar Android之用PopupWindow实现弹出菜单.rar android在wifi下手机与电脑的socket通信.rar android多线程断点下载.rar Android手机一键Root原理分析.zip Android手机的VoIP客户端 Sipdroid.rar Android有未接来电后处理(判断未接来电).rar Android模仿乐淘的应用程序分析源码.zip Android游戏源码——忍者快跑.rar Android自动发送短信.rar Android自动开关机实现.rar Android视频采集+RTSP完整代码(可用) Android远程登录含有loading登录效.zip Angle v1.0_2D游戏引擎.ZIP BOOK看遍所有UI控件.7z BrewClock闹钟.zip BTAndroidWebViewSelection(webview选择文字) cellmap v2.0 基站查询定位导航系统 .rar DialogShow.rar dialog去除边框代码.rar DocumentViewer(PDF阅读器) douBanList(滚动到底部加载新的,软缓存,懒加载) Droid Wall 手机防火墙.zip FBReader修改epub快速加载.rar FiveChess五子棋.zip Flashlight灯光.zip GetSDTree(简单SD卡文件浏览器) hotel宾馆系统.zip ImageView 图片循环跑马灯的效果.rar ipcamera-for-android 手机变成IP Camera.rar jamendo-开源在线音乐.rar jchat4android手机聊天程序.rar LoginXml.rar MineSweeper由java实现.zip miniTwitter登录界面.rar MyAppWeixin(仿微信界面) MyBrowser(简单网页浏览器) Myjob3(图片剪辑功能).rar OPENG开发的示例代码.rar OpenSudoku一个简单的九宫格数独游戏.zip OssSystem(OA系统图书管理简单版).rar Phonegap+HTML5+CSS3+jQuer简单界面模板示例及源码.rar ProgressBar 几乎全部的用法.rar QQ_UI之分类菜单DEMO.zip QQ的登录界面 源代码 .zip quitesleep手机电话功能软件.rar rokon_src_2-0-3_游戏引擎.zip scientific-calculator-for-android( 功能强大的科学计算器).zip SeeJoPlayer(播放器).7z SipDroid客户端源码.rar sipdroid语音及视频通话.rar tablelogin(登陆界面).rar TankWar坦克大战.zip telecapoland-jamendo-android-6cd07fb(国外开源音乐播放器) TorProxy应用实现Android手机无线电电传通讯(TOR).rar UI设计之 仿做蘑菇街UI设计 源码.zip ViewPager-实现左右两个屏幕的切换.rar VIEW双缓冲与SurfaceView比较.zip weibo4andriod-2011-01-14.zip WordPress for Android zirco-browser浏览器源码.rar Zirco-browser:超越海豚的开源浏览器.rar zz-doctor中医大夫助

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值