关键词:
前篇介绍了进程通信中,串行通信的方式Messenger。但如果进程间,有多个方法要并行调用,那么Messenger就不合适使用,而应该使用AIDL方式。
Java方式的AIDL,在之前的文章中有介绍:Android远程接口之AIDL——Parcelable、in、out、inout简例
此处,主要将前文中的Java方式用Kotlin方式翻译。
AIDL方式通信,在Kotlin中遵循和Java中同样的规则,包括数据结构的限制,AIDL文件的编写。
一、AIDL文件编写
AIDL文件的编写,有特定的要求如下:
支持数据类型如下:
1. Java 的原生类型
2. String 和CharSequence
3. List 和 Map ,List和Map 对象的元素必须是AIDL支持的数据类型; 以上三种类型都不需要导入(import)
4. AIDL 自定义生成的接口 需要导入(import)
————————————————
版权声明:本文为CSDN博主「战国剑」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/yangzhaomuma/article/details/50576017
除基础类型外,如果我们要自定义类,需要手动导入(import),并且aidl文件和同名类文件的位置,有做要求:
以上图为例:
1、aidl文件夹与java文件夹,同层次
2、自定义的类,如果要在aidl中使用,有两个需要注意的地方:
2-1: 需要在java文件夹、aidl文件夹两处地方都做定义,并且包名需要一致,如图中的UserInfo类。
2-2: 如UserInfo这种在aidl中使用的自定义类,需要实现 Parcelable 接口。
了解以上规则,就用代码实现相应逻辑。
3、具体的AIDL文件如下(kotlin中,具体的aidl文件写法,还是java形式的):
3-1 IBase.aidl
// IBase.aidl
package com.me.kotlinprocess;
import com.me.kotlinprocess.aidl.UserInfo;
// Declare any non-default types here with import statements
interface IBase
int add(int i,int j);
String getUserInfo(in UserInfo userInfo);
void getaList(out String[] list);
void setaList(in String[] list);
void gettList(inout String[] list);
3-2 UserInfo.aidl
// UserInfo.aidl
package com.me.kotlinprocess.aidl;
// Declare any non-default types here with import statements
parcelable UserInfo;
二、server端实现
server端,只需要实现service接口,并返回onBind的实现即可。此处IBase.Stub即是服务的实现。
kotlin中,服务的实现,应该是屏蔽了in、out 、inout参数的差异。此处生成的方法都是统一以out修饰。此处有疑议,如有不对请指出。
class AidlService : Service()
override fun onBind(intent: Intent?): IBinder?
return stub
val stub:IBase.Stub = object:IBase.Stub()
override fun add(i: Int, j: Int): Int
return i+j
override fun getUserInfo(userInfo: UserInfo?): String
val resultString : String = "---- $userInfo?.name $userInfo?.address $userInfo?.age ----"
return resultString
override fun getaList(list: Array<out String>?)
println("getaList $list?.get(0)")
override fun setaList(list: Array<out String>?)
println("setaList $list?.get(0)")
override fun gettList(list: Array<out String>?)
println("gettList $list?.get(0)")
三、client端实现
client端的实现,流程也很清晰。先连接上服务,之后,可通过接口调用具体的服务。
1、连接服务
var iBase: IBase? = null
//连接定义
private val serviceConnect = object : ServiceConnection
override fun onServiceConnected(name: ComponentName?, service: IBinder?)
println("connect success")
iBase = IBase.Stub.asInterface(service)
override fun onServiceDisconnected(name: ComponentName?)
println("connect fail")
iBase = null
//连接服务
bindService(
Intent(this, AidlService::class.java),
serviceConnect,
Context.BIND_AUTO_CREATE
)
2、调用服务
fun testAidl()
val add = iBase?.add(1, 2)
println("add result $add")
val userInfo: UserInfo = UserInfo()
userInfo.name = "bob"
userInfo.address = "hangzhou"
userInfo.age = 20
val userInfo1 = iBase?.getUserInfo(userInfo)
println("userInfo result $userInfo1")
最后,别忘了在manifest中加上service的定义:
<service
android:name=".aidl.AidlService"
android:label="@string/aidl_name"
android:process=":aidl_remote">
</service>
至此,完成aidl的进程通信。
aidl的信息通信,主要的嘈点在于aidl文件编写和规范、连接管理较为繁琐。可以在这基础上,封装一套简易通信框架。期待后续。
kotlin简单实现aidl进程间通信(代码片段)
上一篇:java简单实现AIDL进程通信,是java版的,现在写一篇kotlin的。具体步骤和上篇文章一样,我直接贴代码。服务端NameServiceclassNameService:Service()overridefunonBind(intent:Intent):IBinder?returnServiceStub()classServic 查看详情
kotlin进程通信------aidl(代码片段)
...le、in、out、inout简例此处,主要将前文中的Java方式用Kotlin方式翻译。AIDL方式通信,在Kotlin中遵循和Java中同样的规则,包括数据结构的限制,AIDL文件的编写。一、AIDL文件编写AIDL文件的编写,有特定的要求如... 查看详情
aidl实现android进程间通信实例(代码片段)
实现Android进程间通信实例有好几种方法:1,AIDL2,Broadcast3,Intent4,ContentProvider记录一下AIDL实现Android进程间通信的方式:Android的AIDL进程间通信实现步骤:一:创建AIDL服务端:aidl文件 查看详情
java简单实现aidl进程通信(代码片段)
目录服务端项目客户端代码安装测试服务端项目新建一个Service,名称设为NameService,如下:publicclassNameServiceextendsServicepublicNameService()@OverridepublicIBinderonBind(Intentintent)returnnull;检查下AndroidManif 查看详情
学习笔记android使用aidl实现进程间通信(代码片段)
一、编写服务端代码1、新建一个Book类,实现Parcelablepackagecom.licheng.android.weextest;importandroid.os.Parcel;importandroid.os.Parcelable;/***Createdbylichengon15/11/16.*/publicclassBookimplementsParcelablepubl 查看详情
浅析aidl的使用和工作原理(代码片段)
...是一种接口定义语言,用于生成可在Android设备上两个进程之间进行进程间通信(IPC)的代码。AIDL的使用新建一个aidl文件,定义进程间通信的接口//IStudentManager.aidlpackagecom.tellh.androidart;//Declareanynon-defaulttypesherewithimportstatements... 查看详情
androidipc之aidl使用(代码片段)
...许你定义客户端和服务都同意的编程接口,以便使用进程间通信(IPC)相互通信。在Android上,一个进程不能正常访问另一个进程的内存,因此Android使用AIDL为你处理。注意ÿ 查看详情
kotlin进程通信------messenger(代码片段)
...ttps://zhuanlan.zhihu.com/p/35519585本文主要介绍应用层上如何用Kotlin来使用Messenger进行进程通讯。Messenger是对底层Binder进行封装后的一套系统框架,在进程间通讯的表现是串行通讯。假设有进程A和进程B。如果要进行多次数据通讯... 查看详情
kotlin进程通信------messenger(代码片段)
...ttps://zhuanlan.zhihu.com/p/35519585本文主要介绍应用层上如何用Kotlin来使用Messenger进行进程通讯。Messenger是对底层Binder进行封装后的一套系统框架,在进程间通讯的表现是串行通讯。假设有进程A和进程B。如果要进行多次数据通讯... 查看详情
java简单实现aidl进程通信(代码片段)
目录服务端项目客户端代码安装测试服务端项目新建一个Service,名称设为NameService,如下:publicclassNameServiceextendsServicepublicNameService()@OverridepublicIBinderonBind(Intentintent)returnnull;检查下AndroidManifest.xml文件:<service... 查看详情
aidl介绍以及简单使用(代码片段)
...以生成一段代码,可以是一个在Android设备上运行的两个进程使用内部通信进程进行交互。如果你想在一个进程中(例如在一个Activity中)访问另一个进程中(例如service)某个对象的方法,你就可以使用AIDL来生 查看详情
android跨进程通信aidl和messenger详解(代码片段)
...道,Android应用一旦启动就会生成一个以包名为名字的进程,当然我们还知道android中很多manager都是运行在systemserver进程中的,像AMS,PMS,WMS等,它们都是通过binder来进程远程调用,说到这就不得不说多... 查看详情
学习笔记android使用aidl实现进程间通信(代码片段)
一、编写服务端代码1、新建一个Book类,实现Parcelablepackagecom.licheng.android.weextest;importandroid.os.Parcel;importandroid.os.Parcelable;/***Createdbylichengon15/11/16.*/publicclassBookimplementsParcelablepublicStringgetName()returnname;publicvoidsetName(Stringname)this.name... 查看详情
aidl实现原理(代码片段)
“在之前有写过一篇《大话android进程通信之AIDL》,但是一直没有补充对应的实现原理“引言说实在的,AIDL跨进程方式用得比较少,也一直比较神秘,这篇文章将剖析AIDL的通信过程,开车!一、AIDL的用法... 查看详情
android跨进程通信binder机制与aidl实例(代码片段)
文章目录进程通信1.1进程空间划分1.2跨进程通信IPC1.3Linux跨进程通信1.4Android进程通信Binder跨进程通信2.1Binder简介2.2Binder驱动2.3Binder原理AIDL编程Demo3.1服务端3.2客户端在操作系统中,进程与进程间的内存和数据都是不共享的。... 查看详情
android跨进程通信binder机制与aidl实例(代码片段)
文章目录进程通信1.1进程空间划分1.2跨进程通信IPC1.3Linux跨进程通信1.4Android进程通信Binder跨进程通信2.1Binder简介2.2Binder驱动2.3Binder原理AIDL编程Demo3.1服务端3.2客户端在操作系统中,进程与进程间的内存和数据都是不共享的。... 查看详情
kotlin进程通信------socket(代码片段)
Socket作为进程通信的一种方式,在日常的进程通信中使用的不频繁,它更常用的是即时通讯、跨设备的一对多场景等。android进程间通信中使用socket,一般是一对一的场景,是常用Socket方式的降级、简单化的使用方... 查看详情
kotlin进程通信------socket(代码片段)
Socket作为进程通信的一种方式,在日常的进程通信中使用的不频繁,它更常用的是即时通讯、跨设备的一对多场景等。android进程间通信中使用socket,一般是一对一的场景,是常用Socket方式的降级、简单化的使用方... 查看详情