基于Android AIDL进程间通信接口使用介绍
发布时间:2021-12-28 05:15:22
AIDL:Android Interface Definition Language,它是一种android内部进程通信接口的描述语言,通过它我们可以定义进程间的通信接口。
ICP:Interprocess Communication ,内部进程通信。
使用:
1、先创建一个aidl文件,aidl文件的定义和java代码类似,但是!它可以引用其它aidl文件中定义的接口和类,但是不能引用自定义的java类文件中定义的接口和类,要引用自定义的接口或类,需要为此类也定义一个对应的aidl文件,并且此类要实现Parcelable接口,同时aidl文件和类文件必须要在相同包下进行声明;Android包含了aidl编译器,当定义好一个aidl文件的时候,会自动编译生成一个java文件,此文件保存在gen目录之下。
在这个项目中,定义了两个aidl文件,其中Person实现了接口Parcelable,下面是这两个aidl文件的定义:
Person.aidl
{
parcelable Person;
}
IAIDLServerService.aidl
{
package com.webview;
import com.webview.Person;// 引用上面的Person.aidl
interface IAIDLServerService{
String sayHello();
Person getPerson();
}
}
2、编写一个Service实现定义aidl接口中的内部抽象类Stub,Stub继承自Binder,并继承我们在aidl文件中定义的接口,我们需要实现这些方法。Stub中文意思存根,Stub对象是在服务端进程中被调用,即服务端进程。
在客户端调用服务端定义的aidl接口对象,实现Service.onBind(Intent)方法,该方法会返回一个IBinder对象到客户端,绑定服务时需要一个ServiceConnection对象,此对象其实就是用来在客户端绑定Service时接收Service返回的IBinder对象。
||public static abstract class Stub extends android.os.Binder implements com.webview.IAIDLServerService
public class AIDLServerService extends Service{@Overridepublic IBinder onBind(Intent intent) {return binder;}private IAIDLServerService.Stub binder = new Stub() {@Overridepublic String sayHello() throws RemoteException {return "Hello AIDL";}@Overridepublic Person getPerson() throws RemoteException {Person person = new Person();person.setName("Livingstone");person.setAge(22);return person;}};}
3、在服务端注册Service,将如下代码添加进Application节点之下!
<service android:name="com.webview.AIDLServerService"
android:process=":remote">
<intent-filter>
<action android:name="com.webview.IAIDLServerService"></action>
</intent-filter>
</service>
至此,服务端进程定义已经完成!
4、编写客户端,注意需要在客户端存一个服务端实现了的aidl接口描述文件,客户端只是使用该aidl接口,获取服务端的aidl对象(IAIDLServerService.Stub.asInterface(service))之后就可以调用接口的相关方法,而对象的方法的调用不是在客户端执行,而是在服务端执行。
public class MainActivity extends Activity {private Button btn;private IAIDLServerService aidlService = null;
private ServiceConnection conn = new ServiceConnection() {@Overridepublic void onServiceDisconnected(ComponentName name) {aidlService = null;}@Overridepublic void onServiceConnected(ComponentName name, IBinder service) {aidlService = IAIDLServerService.Stub.asInterface(service);try {aidlService.doFunction();// 执行接口定义的相关方法} catch (RemoteException e) {e.printStackTrace();}}};@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);btn = (Button) findViewById(R.id.button);tv = (TextView) findViewById(R.id.textview);btn.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {Intent service = new Intent("com.webview.IAIDLServerService");bindService(service, conn, BIND_AUTO_CREATE);// 绑定服务}});}}
客户端目录结构:


猜你喜欢
- Spring中BeanFactory FactoryBean和ObjectFactory的三种的区别引言关于FactoryBean 和 Be
- 前言Postman是一款Http请求模拟工具.它可以模拟各种Http Request,使用起来十分的方便.使用背景利用Spring Boot
- /// <summary>/// 生成二维码/// </summary>/// <param name=&qu
- public class MainActivity extends Activity { private Handler hand
- MD5加密简介哈希算法又称散列算法,是将任何数据转换成固定长度的算法的统称。 从本质上讲,MD5也是一种哈希算法,其输出是生成12
- 前言本文主要给大家介绍了关于Android模仿美团顶部滑动菜单的相关内容,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍吧。先
- 简单的页面分析在上一个文章简单的数据库连接测试,已经测试和数据库做简单的交互,也就是dao层的实现,接下来要说的却是action的简单实现,
- 介绍在本文中,我们将了解如何将现有应用程序迁移到Spring 6以及如何充分利用此升级。本文中的提示基于我在Hypersistence Op
- 一、BigInteger介绍如果在操作的时候一个整型数据已经超过了整数的最大类型长度 long 的话,则此数据就无法装入,所以,此时要使用
- 本文实例讲述了Java线程之守护线程(Daemon)用法。分享给大家供大家参考。具体如下:守护线程(Daemon)Java有两种Thread
- 很多学习Android程序设计的人都会发现每个人对代码的写法都有不同的偏好,比较明显的就是对控件响应事件的写法的不同。因此本文就把这些写法总
- 一、Sharding-JDBC简介Sharding-JDBC是Sharding-Sphere的一个产品,它有三个产品,分别是Sharding
- 一、什么是ASMASM是一个java字节码操纵框架,它能被用来动态生成类或者增强既有类的功能。ASM 可以直接产生二进制 class 文件,
- ★前言打开久违的Live Writer,又已经好久没写博客了,真的太懒了。废话不多说了,直接进入这次博客的主题--Timer。为什么要写这个
- lombok插件使用引入依赖,在项目中使用Lombok可以减少很多重复代码的书写。比如说getter/setter/toString等方法的
- 整理文档,搜刮出一个Android通过HTTP协议实现断点续传下载的代码,稍微整理精简一下做下分享。FileDownloader.java&
- Spring多数据源实现的方式大概有2中,一种是新建多个MapperScan扫描不同包,另外一种则是通过继承AbstractRoutingD
- 本文实例为大家分享了java利用数组随机抽取幸运观众的具体代码,供大家参考,具体内容如下思想:首先将所有观众姓名生成数组,然后获取数组元素的
- 发送虚拟请求访问controller我们在test类中虚拟访问controller,就得发送虚拟请求。先创建一个controllerpack
- 原网页:JavaGuideJVM在执行Java程序过程中会把它管理的内存划分成若干个不同的数据区域。JDK1.8和之前的版本略有不同,下面会