aidl

Android进阶AIDL使用自定义类型

和自甴很熟 提交于 2019-12-12 01:10:24
原文首发于微信公众号:jzman-blog 上篇文章 中主要介绍从 AIDL 的使用方式以及 Android 开发中不同进程之间的通信,遗留的问题是如何在 AIDL 中使用自定义类型,具体步骤如下: 创建自定义类型 声明自定义类型 定义与自定义类型相关的业务 重写业务实体类 远程调用 验证 AIDL 1. 创建自定义类型 自定义类型传输的就是一个实体对象,这个实体类必须实现 Parcelable 接口,具体如下: // 自定义类型 public class Work implements Parcelable { private String title; private String content; // getter、setter、Parcelable 省略 } 2. 声明自定义类型 创建一个 .aidl 文件声明刚才定义的类型,注意与具体业务 .aidl 文件的不同,声明具体如下: // 在.aidl文件中声明自定义类型 package com.manu.aidldemo; parcelable Work; 3. 定义与自定义类型相关的业务 在定义具体业务的 .aidl 文件中定义与自定义类型相关的业务,具体如下: // Declare any non-default types here with import statements import com.manu

Android Studio gradle app:compileDebugAidl Input length = 1

喜欢而已 提交于 2019-12-11 19:17:31
问题 I just upgraded my Android Studio and therefore gradle , play services ... After upgrade, I started getting the following error while trying to running app. org.gradle.api.tasks.TaskExecutionException: Execution failed for task ':app:compileDebugAidl'. at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeActions(ExecuteActionsTaskExecuter.java:110) at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.execute(ExecuteActionsTaskExecuter.java:77) at org

AIDL ERROR while trying to return custom class object

China☆狼群 提交于 2019-12-11 12:27:53
问题 I am trying to pass 'Response' class object using IPC in AIDL. I have made the class parcelable: public class Response implements Parcelable{ private long id; private String speechString; private List<String> responseString = new ArrayList<String>(); //set ... } //get ... public Response(Parcel in) { id = in.readLong(); speechString = in.readString(); if (in.readByte() == 0x01) { responseString = new ArrayList<String>(); in.readList(responseString, String.class.getClassLoader()); } else {

Android: AIDL refusing to generate code from aidl file defining parcelable

社会主义新天地 提交于 2019-12-10 21:42:09
问题 I am trying to build a library with aidls. LOCAL_PATH:= $(call my-dir) include $(CLEAR_VARS) LOCAL_MODULE := test LOCAL_SRC_FILES := $(call all-java-files-under, java) \ java/com/testapp/Istudent.aidl \ java/com/testapp/Itest.aidl \ LOCAL_PREBUILT_JAVA_LIBRARY := framework.jar include $(BUILD_JAVA_LIBRARY) I am trying to refer the Istudent in Itest. Istudent.aidl package com.testapp; parcelable Istudent; Istudent.java public class Istudent implements Parcelable{} Itest.aidl package com

Android 跨进程通信 深入浅出AIDL(二)

徘徊边缘 提交于 2019-12-10 04:23:34
前言 概要 解剖 asInterface asBinder IInterface DESCRIPTOR onTransact服务端接收 transact客户端调用 总结 前言 继 上一篇AIDL 的简单介绍,相信应该对AIDL有一个大致的了解,那么这一篇我们来深入探讨一下AIDL为什么能够完成这个跨进程操作,这其中是否隐藏着一些不为人知的秘密,让我们跟着笔者的思路,慢慢拨开笼罩在AIDL上的谜团。 概要 先用上图整体描述这个AIDL从客户端(Client)发起请求至服务端(Server)相应的工作流程,我们可以看出整体的核心就是Binder 解剖 asInterface 用于将服务端的Binder对象转换成客户端所需的AIDL接口类型的对象,这种转换过程是区分进程的【如果客户端和服务端位于同一进程,那么此方法返回的就是服务端的Stub对象本身,否则返回的是系统封装后的Stub.proxy对象】 private ServiceConnection connection = new ServiceConnection() { @Override public void onServiceConnected(ComponentName name, IBinder service) { IDemandManager demandManager = IDemandManager.Stub

Android 跨进程通信 深入浅出AIDL(一)

落花浮王杯 提交于 2019-12-10 04:09:23
前言 简介 快速上手 服务端 创建载体MessageBean 创建AIDL文件MessageBeanAIDL 创建AIDL文件IDemandManagerAIDL 埋坑与完善 创建Service 客户端 拷贝AIDL文件夹 开启服务 关联对象调用方法 附加技能定时推送消息 服务端项目推送消息 客户端项目接收定时推送 结束语 项目下载 前言 本文主要讲述AIDL作用以及如何快速上手AIDL项目 简介 A [android] I [Interface] D [Definition] L [Language] Android接口定义语言。 作用:方便系统为我们生成代码从而实现跨进程通讯,仅此而已。(玉刚老师如是说也),也就是说这个AIDL就只是一个快速跨进程通讯的工具。 快速上手 本篇文章意在快速实现AIDL项目,更多详细内容下篇继续阐述。 在服务端创建AIDL文件,用来声明java Bean以及传输调用的接口。【声明文件】 在服务端创建Service并且实现上面的接口。【创建服务】 客户端绑定Service。【绑定服务】 客户端调用服务端接口。【跨进程调用】 服务端 创建服务端项目 首先我们在app/src/main 目录下创建AIDL文件夹。 创建载体 MessageBean 首先我们在这个AIDL文件夹里创建用来传输的java Bean对象(包名并不重要),并且实现

什么是aidl?Android AIDL详解

前提是你 提交于 2019-12-09 15:31:45
什么是aidl: aidl是 Android Interface definition language的缩写,一看就明白,它是一种android内部进程通信接口的描述语言,通过它我们可以定义进程间的通信接口 icp:interprocess communication :内部进程通信。 在 Android中, 每个应用程序都有自己的进程,当需要在不同的进程之间传递对象时,该如何实现呢? 显然, Java中是不支持跨进程内存共享的。因此要传递对象, 需要把对象解析成操作系统能够理解的数据格式, 以达到跨界对象访问的目的。在JavaEE中,采用RMI通过序列化传递对象。在Android中, 则采用AIDL(Android Interface Definition Language:接口定义语言)方式实现。 (1)在Eclipse Android工程的Java包目录中建立一个扩展名为aidl的文件。该文件的语法类似于Java代码,但会稍有不同。 (2)如果aidl文件的内容是正确的,ADT会自动生成一个Java接口文件(*.java)。 (3)建立一个服务类(Service的子类)。 (4)实现由aidl文件生成的Java接口。 (5)在AndroidManifest.xml文件中配置AIDL服务,尤其要注意的是,<action>标签中android

浅析AIDL的使用和工作原理

杀马特。学长 韩版系。学妹 提交于 2019-12-09 15:19:02
AIDL是一种接口定义语言,用于生成可在Android设备上两个进程之间进行进程间通信(IPC)的代码。 AIDL的使用 新建一个aidl文件,定义进程间通信的接口 // IStudentManager.aidl package com.tellh.androidart; // Declare any non-default types here with import statements import com.tellh.androidart.Student;   interface IStudentManager {    List<Student> getStudent();   void addStudent(in Student student); } 注意点: aidl中支持的参数类型为:基本类型(int,long,char,boolean等),String,CharSequence,List,Map,其他类型必须使用import导入,即使它们可能在同一个包里。 接口中的参数除了aidl支持的类型,其他类型必须标识其方向:到底是输入还是输出抑或两者兼之,用in,out或者inout来表示。 如果有自定义的数据类型,需要把自定义类实现Parcelable接口并新建aidl声明文件。 // Student.aidl package tellh.com.androidart

android使用aidl实现进程间通信

我的未来我决定 提交于 2019-12-09 15:07:35
在 Android 中 , 每个应用程序都有自己的进程,当需要在不同的进程之间传递对象时,该如何实现呢 ? 显然 ,Java 中是不支持跨进程内存共享的。因此要传递对象 , 需要把对象解析成操作系统能够理解的数据格式 , 以达到跨界对象访问的目的。 在 JavaEE 中,采用 RMI 通过序列化传递对象。 在 Android 中 , 用 AIDL(Android Interface Definition Language :接口定义语言 ) 方式实现。 AIDL 是一种接口定义语言,用于约束两个进程间的通讯规则,供编译器生成代码,实现 Android 设备上的两个进程间通信 (IPC) 。 由于进程之间的通信信息需要双向转换,所以 android 采用代理类在背后实现了信息的双向转换 ,代理类由 android 编译器生成,对开发人员来说是透明的。 具体实现 假设 A 应用需要与 B 应用进行通信,调用 B 应用中的 download(String path) 方法, B 应用以 Service 方式向 A 应用提供服务。需要下面四个步骤 : 1 ) 在 B 应用中创建 *.aidl 文件 , aidl 文件的定义和接口的定义很相类,如:在 com.alex.aidl 包下创建 IDownloadService.aidl 文件,内容如下: package com.alex.aidl

[翻译]Android接口定义语言 (AIDL)

孤人 提交于 2019-12-09 15:00:55
AIDL(Android接口定义语言)与你可能使用过的其它的IDLs是类似的。它允许你定义客户端与service协调一致的编程接口,以便于彼此之间使用进程间通信(IPC)机制进行通信。在Android上,一个进程通常不能访问另一个进程的内存。可以说,它们需要把它们的对象分解为操作系统能够理解的原始数据类型,并在进程之间按次序排列对象。那种排列对象的代码写起来是很乏味的,因此Android通过AIDL来为你处理这些事情。 注意: 只有在你允许来自于不同的应用的客户端访问你的service以实现IPC,并想要在你的service中处理多线程时,才需要使用AIDL。如果你不需要跨不同应用执行并发IPC,你应该通过 实现一个Binder 来创建你的接口,或者如果你想要执行IPC,但不需要处理多线程,可以 使用一个 Messenger 来实现你的接口。无论哪种,请确保在实现一个AIDL之前,你理解了 Bound Services 。/ 在开始设计你的AIDL接口之前,请意识到对于一个AIDL接口的调用是 直接的函数调用 (大概指的是阻塞调用,在调用一个IPC方法时,客户端线程会一直等待,直到service端处理完成并返回) 。你不应该假设调用所发生的线程。依赖于调用是来自于本进程的一个线程,还是一个远端进程,则会发生不同的事情。特别地: 发起于本进程的调用将在发起调用相同的线程中执行