IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 移动开发 -> Kotlin进程通信------AIDL -> 正文阅读

[移动开发]Kotlin进程通信------AIDL

前篇介绍了进程通信中,串行通信的方式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文件编写和规范、连接管理较为繁琐。可以在这基础上,封装一套简易通信框架。期待后续。

  移动开发 最新文章
Vue3装载axios和element-ui
android adb cmd
【xcode】Xcode常用快捷键与技巧
Android开发中的线程池使用
Java 和 Android 的 Base64
Android 测试文字编码格式
微信小程序支付
安卓权限记录
知乎之自动养号
【Android Jetpack】DataStore
上一篇文章      下一篇文章      查看所有文章
加:2021-07-11 16:45:21  更:2021-07-11 16:45:52 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/20 7:02:02-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码