打算写一篇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. 编程精粹:编写高质量的C语言代码———笔记一

    第一章 假想的编译程序 要记得对空语句进行处理,最好使用NULL使其明显可见 char * strcpy(char* pchTo, char* pchFrom) { char* pchStart = ...

  2. Linux(ubuntu)下安装JDK、Tomcat

    一.安装jdk 1)首先以root用户登录进去,在根目录下建立opt的目录,我们将下载的东西都放到该目录下去. 2)下载j2sdk ,如jdk-6u31-linux-i586.bin 下载地址如下ht ...

  3. 自动化测试(四):VBScript脚本语言

    VBS基于对象,只能利用现成的对象,不能封装.继承等,意味着不是真正的面向对象 语言的学习: 1.数据定义,变量定义,表达式 2.程序控制结构 3.函数,方法,类 4.异常处理 VBScript的数据 ...

  4. 介绍并扩展Fitnesse的测试模块化机制:ScenarioTable

    摘要:在验收测试框架Fitneese中,使用Scenario可以把最常用的测试步骤封装起来,从而达到模块化定义Fitnesse测试用例的能力.但Scenario仅限于封装Script测试步骤,Scri ...

  5. vi常用命令与设置(不断修改中)

    注:前缀':'表示vim命令(命令模式),前缀'$'表示为shell命令,表示Ctrl + W,表示Ctrl + Shift+ 6,无前缀者均为普通模式下的键盘按键.基本的插入与修改:         ...

  6. php中的字符串和正则表达式

    一.字符串类型的特点 1.PHP是弱类型语言,其他数据类型一般都可以直接应用于字符串函数操作. 1: <?php //输出345 //输出345 //先查找hello常量,若没找到,将hello ...

  7. 2014年25 款最新最棒的jQuery插件

    网络上提供了大量非常有用的 jQuery 插件,帮助大家完善网站的体验.所以我们在这里收集了 2014 年发布的,并且是非常有用的插件,希望能帮助大家找到自己需要并且喜欢的,提升网站的质量! HAMM ...

  8. BestCoder Round #68 (div.2) 1002 tree

    题意:给你一个图,每条边权值0或1,问每个点周围最近的点有多少个? 思路:并查集找权值为0的点构成的连通块. #include<stdio.h> #include<string.h& ...

  9. 关于java线程池 Ⅱ

    上一篇翻译了线程池主要部分的api,经过一段时间的学习,这里记录一下这段时间对jdk自带线程池的学习成果. 为了方便说明,先放一张类图,包括了jdk线程池主要涉及到的类,为了条理清晰去掉了部分依赖和关 ...

  10. Android实例-如何使用系统剪切板(XE8+小米2)

    结果: 发现个问题,就是粘贴时会清除之前的信息. unit Unit1; interface uses System.SysUtils, System.Types, System.UITypes, S ...