kotlin进程通信------aidl(代码片段)

战国剑 战国剑     2022-12-05     348

关键词:

前篇介绍了进程通信中,串行通信的方式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方式的降级、简单化的使用方... 查看详情