打算写一篇Binder介绍的文章,仔细想想一篇文章貌似很难厘清,于是我打算从AIDL入手,本篇先来简单介绍下AIDL的使用,然后在此基础上我们继续来研究Binder的工作原理。小伙伴们都知道,AIDL(Android Interface definition language)是Android跨进程通信(IPC)的一种方式,另一种常见的跨进程通信方式Messenger就是在AIDL的基础继续封装实现的。那么本篇博客我们就先来介绍一下AIDL的基本用法。

AIDL在使用的过程中分为服务端App和客户端App,我们来分别看一下两个的开发流程:

服务端开发步骤:
1.创建一个aidl文件夹,NEW->FOLDER->AIDL FOLDER
2.创建一个AIDL 文件,两种创建方式:
2.1 创建一个Java接口文件,删掉修饰符,将文件后缀名改为aidl
2.2 NEW->AIDL->AIDL FILE
3.rebuild project,检查是否生成对应的Java文件,app->build->generated->source->aidl->debug->
4.创建一个Service,在Service中定义内部类继承自AIDL所生成的Java类中的Stub类,并实现该类中的方法
5.在清单文件中注册Service,注意添加exported属性和action

客户端开发步骤:
1.将服务端的AIDL文件夹拷贝至客户端的main文件夹下
2.rebuild project,检查是否生成对应的Java文件
3.绑定服务

OK,这里我们就先按照服务端的开发步骤来实现服务端,假设我的服务端要提供一个加法运算,客户端调用这个方法得到两个数的和。OK,那么在服务端首先创建AIDL文件夹,然后创建AIDL文件:

然后编译项目,查看相应的Java类是否生成:

接下来创建Service,并返回一个Binder实例:

public class MyAddService extends Service {
@Nullable
@Override
public IBinder onBind(Intent intent) {
return new MyBinder();
} class MyBinder extends IMyAddAidl.Stub { @Override
public int add(int a, int b) throws RemoteException {
return a + b;
}
}
}

接下来,清单文件注册Service:

<service android:name=".MyAddService" android:exported="true">
<intent-filter>
<action android:name="myaddservice" />
</intent-filter>
</service>

exported表示将这个服务暴露给第三方应用使用。OK,至此,我们的服务端就开发完成了。接下来我们来看看客户端,首先把服务端的aidl文件连同它的文件夹都先拷贝到客户端,然后编译客户端项目,这个时候AIDL会在客户端生成和服务端一模一样的Java代码,然后我们通过绑定式来启动一个服务,如下:

Intent intent = new Intent("myaddservice");
intent.setPackage("org.sang.aidlhost");
ServiceConnection conn = new ServiceConnection() { @Override
public void onServiceConnected(ComponentName name, IBinder service) {
mIMyAddAidl = IMyAddAidl.Stub.asInterface(service);
} @Override
public void onServiceDisconnected(ComponentName name) { }
};
boolean b = bindService(intent, conn, Service.BIND_AUTO_CREATE);

然后我们就可以在客户端调用服务端了,调用方式如下:

try {
int add = mIMyAddAidl.add(13, 14);
Log.d("google.sang", "add: " + add);
} catch (RemoteException e) {
e.printStackTrace();
}

OK,这就是我们说的AIDL的一个基本使用,可以实现不同App之间的跨进程通信。

OK ,本文就算是一个楔子吧,下篇博客我们再来详细分析为什么客户端能够调通服务端。

Demo下载http://download.csdn.net/detail/u012702547/9646635

深入理解Binder(一),从AIDL谈起的更多相关文章

  1. 源码分析——从AIDL的使用开始理解Binder进程间通信的流程

    源码分析——从AIDL的使用开始理解Binder进程间通信的流程 Binder通信是Android系统架构的基础.本文尝试从AIDL的使用开始理解系统的Binder通信. 0x00 一个AIDL的例子 ...

  2. 深入理解Binder(二),Binder是什么?

    上篇文章深入理解Binder(一),从AIDL谈起我们介绍了AIDL的基本使用,用AIDL两个App的通信是实现了,可是又有小伙伴疑惑了,为什么使用AIDL就能够实现两个App之间的通信?本文我们就来 ...

  3. Android-彻底地理解Binder

    转自:https://blog.csdn.net/huachao1001 https://blog.csdn.net/huachao1001/article/details/51504469 你是不是 ...

  4. 从Activity的启动流程理解Binder

    简述 关于Activity启动流程和Binder的文章很多,大多数是分开来讲的,本文将二者结合起来,着重分析启动流程中跨进程方面的细节,其实,启动流程看似调用繁多,主要是复杂在Activity栈管理等 ...

  5. 从mediaserver入手快速理解binder机制(最简单理解binder)【转】

    本文转载自;https://blog.csdn.net/u010164190/article/details/53015194 Android的binder机制提供一种进程间通信的方法,使一个进程可以 ...

  6. 深入理解.NET程序的原理 谈一谈破解.NET软件的工具和方法

    最近一段时间不忙,闲下来的空闲时间,重读了一下CLR的原理,回味一下有关程序集的的知识,顺便练了一下手,学习致用,破解了若干个.NET平台的软件.以此来反观.NET程序开发中,需要注意的一些问题. 基 ...

  7. 理解Web路由(浅谈前后端路由与前后端渲染)

    1.什么是路由? 在Web开发过程中,经常会遇到『路由』的概念.那么,到底什么是路由?简单来说,路由就是URL到函数的映射. 路由的概念最开始是由后端提出来的,在以前用模板引擎开发页面的时候,是使用路 ...

  8. 【深入理解CLR】2:细谈值类型的装箱和拆箱

    装箱 总所周知,值类型是比引用类型更“轻型”的一种类型,因为它们不作为对象在托管堆中分配,不会被垃圾回收,也不通过指针来引用.但在许多情况下,都需要获取对值类型的一个实例的引用.例如,假定要创建一个A ...

  9. 深入理解JVM(③)再谈线程安全

    前言 我们在编写程序的时候,一般是有个顺序的,就是先实现再优化,并不是所有的牛P程序都是一次就写出来的,肯定都是不断的优化完善来持续实现的.因此我们在考虑实现高并发程序的时候,要先保证并发的正确性,然 ...

随机推荐

  1. svn版本控制-windows篇

    一.准备工作 1.获取 Subversion 服务器程序(服务端) 到官方网站(http://subversion.tigris.org/)下载最新的服务器安装程序.目前最新的是1.5版本,具体下载地 ...

  2. codeforces 676D Theseus and labyrinth BFS搜索

    分析:一个n*m的矩阵,每个格子有12个状态,每次按一次,每个格子转90度,所以整个矩阵只有4种状态,然后爆搜就好了 #include <cstdio> #include <iost ...

  3. e2e 自动化集成测试 架构 实例 WebStorm Node.js Mocha WebDriverIO Selenium Step by step (三) SqlServer数据库的访问

    上一篇文章“e2e 自动化集成测试 架构 京东 商品搜索 实例 WebStorm Node.js Mocha WebDriverIO Selenium Step by step 二 图片验证码的识别” ...

  4. 树莓PI上跑爬虫

    主要是进行主机上使用myeclipse开发后,在从机上跑最后的程序 在主机上和树莓上都安装好java环境,maven,ant 拷到RPI上的时候修改

  5. bzoj 3198 [Sdoi2013]spring(容斥原理+Hash)

    Description Input Output Sample Input 3 3 1 2 3 4 5 6 1 2 3 0 0 0 0 0 0 4 5 6 Sample Output 2 HINT [ ...

  6. linux 配置静态IP

    ip配置方法是编辑sudo nano  /etc/network/interfaces 树莓派默认配置 auto lo iface lo inet loopback iface eth0 inet d ...

  7. [iOS基础控件 - bugs]

    1.不能呼出iOS模拟器键盘 Can't find keyplane that supports type 4 for keyboard iPhone-Portrait-NumberPad 解决:Ha ...

  8. [iOS基础控件 - 3.4] 汤姆猫

    @import url(http://i.cnblogs.com/Load.ashx?type=style&file=SyntaxHighlighter.css); @import url(/ ...

  9. Linux就是这个范儿之第一次亲密接触(3)

    原创作品,允许转载,转载时请务必以超链接形式标明文章原始出处 .作者信息和本声明.否则将追究法律责 1.4 返璞归真的命令行 有一种说法,现代计算机不是靠电力驱动,而是靠“鼠标”.多少应用程序的界面需 ...

  10. JSP九大内置对象分析

    JSP九大内置对象分为三类: 1.输入输出对象:out对象.response对象.request对象 2.通信控制对象:pageContext对象.session对象.application对象 3. ...