ANDROID AIDL

AndroidStudio下使用 AIDL 构建跨进程 Service( 详细代码贴图 ), 填补网上的大多数坑 现在百度一下的 AIDL、跨进程 Service, 文章一大堆, 然而自己做起来还是有各种各样的不顺. 先说下实现流程 AIDL最简单实现流程 先写服务端 新建AIDL文件 新建完成后会在src/main下生成aidl目录, 修改生成的aidl文件, 写入自己的接口方法 编译程序, AS 会在 build 目录中自动生成 aidl 对应的 java 实现 写好远程服务... 阅读详情

也可参考:http://buaadallas.blog.51cto.com/399160/372090 的Android AIDL(Android Interface Definition Language)介绍

 

AIDL,全称是Android Interface Definition Language(接口描述语言),主要用户Android不同进程间的通信。

 

建立AIDL服务的步骤(1)

建立AIDL服务要比建立普通的服务复杂一些,具体步骤如下:

(1)在Eclipse Android工程的Java包目录中建立一个扩展名为aidl的文件。该文件的语法类似于Java代码,但会稍有不同。详细介绍见实例52的内容。

(2)如果aidl文件的内容是正确的,ADT会自动生成一个Java接口文件(*.java)。

(3)建立一个服务类(Service的子类)。

(4)实现由aidl文件生成的Java接口。

(5)在AndroidManifest.xml文件中配置AIDL服务,尤其要注意的是,<action>标签中 android:name的属性值就是客户端要引用该服务的ID,也就是Intent类的参数值。这一点将在实例52和实例53中看到。

实例52:建立AIDL服务

AIDL服务工程目录:src/ch08/ch08_aidl

客户端程序工程目录:src/ch08/ch08_aidlclient

本例中将建立一个简单的AIDL服务。这个AIDL服务只有一个getValue方法,该方法返回一个String类型的值。在安装完服务后,会在 客户端调用这个getValue方法,并将返回值在TextView组件中输出。建立这个AIDL服务的步骤如下:

(1)建立一个aidl文件。在Java包目录中建立一个IMyService.aidl文件。IMyService.aidl文件的位置如图 8.24所示。

  
图8.24  IMyService.aidl文件的位置

IMyService.aidl文件的内容如下:

 

IMyService.aidl文件的内容与Java代码非常相似,但要注意,不能加修饰符(例如,public、private)、AIDL服务 不支持的数据类型(例如,InputStream、OutputStream)等内容。

(2)如果IMyService.aidl文件中的内容输入正确,ADT会自动生成一个IMyService.java文件。读者一般并不需要关心 这个文件的具体内容,也不需要维护这个文件。关于该文件的具体内容,读者可以查看本节提供的源代码。

(3)编写一个MyService类。MyService是Service的子类,在MyService类中定义了一个内嵌类 (MyServiceImpl),该类是IMyService.Stub的子类。MyService类的代码如下:

 

在编写上面代码时要注意如下两点:

IMyService.Stub是根据IMyService.aidl文件自动生成的,一般并不需要管这个类的内容,只需要编写一个继承于 IMyService.Stub类的子类(MyServiceImpl类)即可。

onBind方法必须返回MyServiceImpl类的对象实例,否则客户端无法获得服务对象。

(4)在AndroidManifest.xml文件中配置MyService类,代码如下:

 

其中"net.blogjava.mobile.aidl.IMyService"是客户端用于访问AIDL服务的ID。

下面来编写客户端的调用代码。首先新建一个Eclipse Android工程(ch08_aidlclient),并将自动生成的IMyService.java文件连同包目录一起复制到 ch08_aidlclient工程的src目录中,如图8.25所示。

  
图8.25  IMyService.java文件
在 ch08_aidlclient工程中的位置

调用AIDL服务首先要绑定服务,然后才能获得服务对 象,代码如下:

使用bindService方法来绑定AIDL服务。其中需要使用Intent对象指定AIDL服务的ID,也就是<action>标 签中android:name属性的值。

在绑定时需要一个ServiceConnection对象。创建ServiceConnection对象的过程中如果绑定成功,系统会调用 onServiceConnected方法,通过该方法的service参数值可获得AIDL服务对象。

首先运行AIDL服务程序,然后运行客户端程序,单击【绑定AIDL服务】按钮,如果绑定成功,【调用AIDL服务】按钮会变为可选状态,单击这个 按钮,会输出getValue方法的返回值,如图8.26所示。

 
图8.26  调用AIDL服务的客户端程序

实例53:传递复杂数据的AIDL服务

AIDL服务工程目录:src/ch08/ch08_complextypeaidl

客户端程序工程目录:src/ch08/ch08_complextypeaidlclient

AIDL服务只支持有限的数据类型,因此,如果用AIDL服务传递一些复杂的数据就需要做更一步处理。AIDL服务支持的数据类型如下:

Java的简单类型(int、char、boolean等)。不需要导入(import)。

String和CharSequence。不需要导入(import)。

List和Map。但要注意,List和Map对象的元素类型必须是AIDL服务支持的数据类型。不需要导入(import)。

AIDL自动生成的接口。需要导入(import)。

实现android.os.Parcelable接口的类。需要导入(import)。

其中后两种数据类型需要使用import进行导入,将在本章的后面详细介绍。

传递不需要import的数据类型的值的方式相同。传递一个需要import的数据类型的值(例如,实现 android.os.Parcelable接口的类)的步骤略显复杂。除了要建立一个实现android.os.Parcelable接口的类外,还需 要为这个类单独建立一个aidl文件,并使用parcelable关键字进行定义。具体的实现步骤如下:

(1)建立一个IMyService.aidl文件,并输入如下代码:

 

在编写上面代码时要注意如下两点:

Product是一个实现android.os.Parcelable接口的类,需要使用import导入这个类。

如果方法的类型是非简单类型,例如,String、List或自定义的类,需要使用in、out或inout修饰。其中in表示这个值被客户端设 置;out表示这个值被服务端设置;inout表示这个值既被客户端设置,又被服务端设置。

 

(2)编写Product类。该类是用于传递的数据类型,代码如下:

在编写Product类时应注意如下3点:

Product类必须实现android.os.Parcelable接口。该接口用于序列化对象。在Android中之所以使用 Pacelable接口序列化,而不是java.io.Serializable接口,是因为Google在开发Android时发现 Serializable序列化的效率并不高,因此,特意提供了一个Parcelable接口来序列化对象。

在Product类中必须有一个静态常量,常量名必须是CREATOR,而且CREATOR常量的数据类型必须是 Parcelable.Creator。

在writeToParcel方法中需要将要序列化的值写入Parcel对象。

 

(3)建立一个Product.aidl文件,并输入如下内容:

parcelable Product;

 

(4)编写一个MyService类,代码如下:

 

(5)在AndroidManifest.xml文件中配置MyService类,代码如下:

 

在客户端调用AIDL服务的方法与实例52介绍的方法相同,首先将IMyService.java和Product.java文件复制到客户端工程

(ch08_complextypeaidlclient),然后绑定AIDL服务,并获得AIDL服务对象,最后调用AIDL服务中的方法。完整的客户 端代码如下:

 

 

首先运行服务端程序,然后运行客户端程序,单击【绑定AIDL服务】按钮,待成功绑定后,单击【调用AIDL服务】按钮,会输出如图8.27所示的 内容。

 
Android 关于AIDL你需要知道的一切 好的,由于上周拖更,本次带来Android进程通信详解–AIDL,虽然网上关于这个内容的资料丰富且详细,但一千个读者就有一千个哈姆雷特不是嘛,对于任何东西都要有自己的见解。Service关于AIDL,Service就是我们不得不提的东西了,它是Android四大组件之一,太基础的东西这里我们就不再赘述,下面还是给出一些我对于Service的认识:上图为Service的生命周期从图里不难看出,Serv 阅读详情

相关推荐

Android生成C++ AIDL

Android生成C++ AIDL

薛文旺 2826

Android AIDL Service调试方法

问题假设现在有A和B两个进程,其中A注册了一个Service,B调用了该Service。而你即使在service当中打了断点,无论对A还是对B进行Debug都还是无法停在断点处。如何解决这个问题?解决方案环境:Android Studio 1.5步骤1首先定位到A的Manifest中注册Service的部分,在android:name后增加一句:android:process=":remote"即让

临安雨潇 2631

安卓面经_安卓基础面全解析_Android面经(14/30)之AIDL全解析

如果需要实现跨进程通讯,AIDL是非常好的选择,在日常开发中接触到AIDL的机会非常多,个人在面试中暂时没被问过,但实际开发中无论是在应用程序中还是系统服务中,都使用过AIDL。我们看看面试官可能会问什么吧

a763450633的博客 780

Android跨进程通信——AIDL原理解析

本篇文章的内容如下: 1 AIDL简介 2 为什么要设置AIDL 3 AIDL的注意事项 4 AIDL的使用 5 源码跟踪 6 AIDL的设计给我们的思考 7 总结 一、AIDL简介 AIDL是一个缩写,全程是Android Interface Definition Language,也是android接口定义语言。准确的来说,它是用于定义客户端/服务器通信接口的一种描述语言。它其实一种IDL语言,可以拿来生成用于IPC的代码。从某种意义上说它其实是一个模板。为什么这么说?因为在我们

Jason_Lee155的博客 9626

【深度学习】tensorboard中的图片放到论文中

1. 利用tensorboard中的导出数据功能 选中左上角的标签,然后选择csv格式的数据下载即可。 左边的smoothing 数值不影响导出数据的大小。 2.tensorboard 图下标签介绍: 放大 Toggle y-axis log scale:将y轴对数化 Fit domain to data:如果拖动了图片等,再重新回到原始位置 Download Current Chart as SVG 3.用下载下来的csv数据来画图 第一幅图片:训练的平均长度 fig, ax1 = plt.sub

gaocui883的博客 1万+

告别环境报错:Qt Creator里配置Android SDK/NDK/JDK路径的完整避坑指南

本文详细解析了在Qt Creator中配置Android SDK/NDK/JDK路径的完整避坑指南,深入探讨了路径检测的内部机制、构建套件配置的隐藏逻辑以及项目级与全局配置的优先级。通过实际案例和高级排查技巧,帮助开发者解决常见的环境报错问题,提升Qt安卓开发效率。

weixin_42548829的博客 238

Android 中AIDL的使用与理解

AIDL的使用:最常见的aidl的使用就是Service的跨进程通信了,那么我们就写一个Activity和Service的跨进程通信吧。 首先,我们就在AS里面新建一个aidl文件(ps:现在AS建aidl不要求和java包名相同了):package aidl; interface IMyInterface { String getInfor(String s); }可以看到,在这里面我们

stromxu 的专栏 4万+

六自由度机器人(机械臂)运动学建模及运动规划系列(四)——轨迹规划

本篇介绍了六轴机器人关节空间以及笛卡尔空间轨迹规划的简单方法,并给出了一种几何解法,以简化规划过程,并提供了简单的Matlab轨迹规划函数介绍。

weixin_47849087的博客 5万+

android aidl的使用及demo

demo下载地址 https://download.youkuaiyun.com/download/u010672559/10610856 ---------- 概述:AIDL即跨进程通信  1.在main下面新建aidl文件 // IMyAidlInterface.aidl package com.android.aidl; // Declare any non-default types her...

u010672559的博客 3235

231003-四步MacOS-iPadOS设置无线竖屏随航SideCar

新建虚拟屏幕参考文献。

专注机器学习之路 7485

别再折腾Windows了!Ubuntu 22.04下USRP X310 + RFNoC + Vivado 2021.1开发环境保姆级搭建指南

本文提供Ubuntu 22.04下USRP X310 + RFNoC + Vivado 2021.1开发环境的详细搭建指南,涵盖系统优化、UHD驱动编译、Vivado配置及硬件验证等关键步骤,帮助射频工程师高效构建稳定的开发环境,显著提升FPGA开发效率。

weixin_29168675的博客 255

一文搞懂Android AIDL

AIDL(Android Interface Definition Language)用于在Android应用中实现进程间通信(IPC)。它允许不同应用或服务间的数据传递和方法调用,确保不同进程间能够相互访问和操作。通过AIDL,开发者可以定义一个接口,然后在服务端和客户端实现这个接口,实现跨进程的交互。背景上,AIDL主要解决了Android系统中的进程隔离问题,使得不同应用或进程能够安全有效地共享数据和功能。

WriteBug001的博客 9431

工控安全政策系列导读:国际标准IEC 62443标准系列

IEC 62443由ANSI/ISA提出,被ISO/IEC采纳,所以该标准会以不同的名字出现,包括:ANSI/ISA-99,ISA-99,ISA 62443,ISO/IEC 62443,ISO 62443,IEC 62443。其中IEC 62443-2-1已等同采纳为国标,于2016年10月发布,标准编号为GB/T 33007。 IEC 62443是在国...

weixin_34132768的博客 2621

安卓的AIDL总结

安卓中跨进程通讯时常常需要AIDL,因此总结一下AIDL的用法和简要分析AIDL的工作流程。 在Android Studio中可以直接创建AIDL文件,创建的AIDL文件会生成在新创建的aidl文件夹下。 建议在aidl下建立实体类,这样可以将整个aidl直接拷贝,建立的文件列表如下: Book是实现了Parcelable的实体类: public class Book implemen

momo_ibeike的博客 847

热力学仿真软件:Fluent_(8).材料属性设置

在 Fluent 中,材料属性主要包括密度、比热容、导热系数、黏度等物理性质。这些属性在不同的仿真场景中有着不同的作用,例如在流体仿真中,密度和黏度是必不可少的;在传热仿真中,导热系数和比热容是主要考虑的因素。如果所需的材料不在材料库中,或者需要对现有材料进行修改,用户可以自定义材料属性。在主菜单中选择Materials。点击打开材料编辑器。在材料编辑器中,点击Create按钮,输入新的材料名称。选择材料类型(如FluidSolid等)。在属性栏中填写所需的材料属性。

kkchenjj的博客 1492

GPU 运维实战:H100/H800/B300 换卡与压测

(烧多久、看什么、什么算合格)。文末还给了一个能直接跑的验收判定脚本,三个真实场景的裁决输出都在。

老韩的Linux云计算架构师进阶之路 270

Android进阶——AIDL详解

1. 简介 AIDL(Android 接口定义语言),可以使用它定义客户端与服务端进程间通信(IPC)的编程接口,在 Android 中,进程之间无法共享内存(用户空间),不同进程之间的通信一般使用 AIDL 来处理。 使用流程: 在 .aidl 文件中定义 AIDL 接口,并将其添加到应用工程的 src 目录下,创建完成之后 rebuil Android SDK 工具会自动生成基于该 .aidl 文件的 IBinder 接口,具体的业务对象实现这个接口,这个具体的业务对象也是 IBinder 对象,当绑

Yawn 2万+

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

安卓使用android studio跨进程通信之AIDL

android studio开发Aidl跨进程项目

沐的博客 1万+

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

《android初步学习》关于安卓中AIDL的使用及蓝牙中相应运用

本文主要参考 :http://blog.youkuaiyun.com/liuhe688/article/details/6400385 初步学习安卓,遇见了AIDL的相关知识点,特写了这样一篇blog方便交流与自己以后的复习查阅。 首先AIDL的作用: 在Android中,每个应用(Application)执行在它自己的进程中,无法直接调用到其他应用的资源,那我们有时需要在应用间交互,怎么办呢?于是,A

bei164688737的专栏 1528

Android AIDL

Contents Android AIDL. 1 定义AIDL接口... 1 1.创建.aidl文件... 2 2.实现接口... 4 3.暴露接口给客户端... 5 IPC之间传递对象... 7 调用IPC方法... 9   Android AIDL Android AIDL跟其他IDL语言相似。AIDL定义一套client端和service端都支持的编程接口,供IPC使用。...

yubing1015的博客 2718

安卓AIDL的使用

IPC通信机制方式之一AIDL通信

shengjiaxin的博客 2461

Android AIDL 使用教程

AIDL(Android Interface Definition Language)是一种 IDL 语言,用于生成可以在 Android 设备上两个进程之间进行进程间通信(IPC)的代码。 通过 AIDL,可以在一个进程中获取另一个进程的数据和调用其暴露出来的方法,从而满足进程间通信的需求。通常,暴露方法给其他应用进行调用的应用称为服务端,调用其他应用的方法的应用称为客户端,客户端通过绑定服务端的 Service 来进行交互。...

hello_1995的博客 4万+

也许你从不曾了解过安卓AIDL

你从没听过的AIDL知识

无心下棋 1155

代码解析:安卓VHAL的AIDL参考实现

HIDL VHAL中接口定义文件为types.hal,IVehicle.hal和IVehicleCallback.hal。AIDL VHAL中,IVehicle .aidl和IVehicleCallback.aidl对应IVehicle.hal和IVehicleCallback.hal。

叶辞树的博客 1754

android之AIDL篇

1.什么是aidl Android使用的一种接口定义语言(Interface Definition Language,IDL)来公开服务的接口。因此,可以将这种可以跨进程访问的服务称为AIDL(Android Interface Definition Language)服务。 2.AIDL基本语法 AIDL使用简单的语法来声明接口,描述其方法以及方法的参数和返回值。这些参数和返回值可以是任何类型,...

baidu_32015283的博客 3636
上一篇: Android Broadcast生命周期及注册机制
下一篇: Android权限机制总结与常见权限不足问题分析
debug2
博客等级 码龄20年 21粉丝 3原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值