Android好用的进程间通信框架-RAMessage
Posted QXXXD
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Android好用的进程间通信框架-RAMessage相关的知识,希望对你有一定的参考价值。
一个类似Retrofit的IPC通信框架,支持Java、Kotlin以及同步调用、异步调用、协程
一个高可用、高维护、高性能、线程安全的IPC通信框架。(android全平台支持,仅98kb) 核心思路是hook了Handler中的Messenger实现;(服务端目前需要有反射hide的API的能力,否则功能会降级)
- Kotlin 👍
- Java 👍
- Android 4 - Android 12+ 👍
- 同步调用 👍
- 异步调用 👍
- 线程安全 👍
- 一个服务端对多客户端 👍
- 协程 👍
- 支持接口参数、返回参数为:基本类型或实现了Parcelable或List 👍
- 提醒消息 (WIP)
- 异常机制 (WIP)
如何使用
客户端
-
- 先在客户端定义想要IPC的接口;
interface RaTestInterface
fun testReturnAModel(testString: String, testNumber: Int): RaTestModel?
fun testReturnAllList(testString: String): List<RaTestModel>?
fun testVoid()
fun testBoolean(): Boolean
fun testString(): String
fun testSendString(testString: String): String
// 推荐使用
suspend fun suspendFun(): Boolean
-
- 在客户端绑定远程服务成功后,通过
RaClientApi.INSTANCE.create(RaTestInterface::class.java)
方法即可获得对应服务,然后调用对应接口即可;
- 在客户端绑定远程服务成功后,通过
客户端示例
// 1. 提供被绑定的远程服务器名字;2. 在绑定成功后,调用远程服务即可;
RaClientApi.INSTANCE.bindRaConnectionService(this, ComponentName("com.softtanck.ramessageservice", "com.softtanck.ramessageservice.RaConnectionService"), object : BindStateListener
override fun onConnectedToRaServices()
Log.d("~~~", "connectedToRaServices: $this")
val testInterface = RaClientApi.INSTANCE.create(RaTestInterface::class.java)
val testReturnAModel = testInterface.testReturnAModel("I am from the caller", 1)
Log.d("~~~", "testReturnAModel:$testReturnAModel?.testString")
val testReturnAllList = testInterface.testReturnAllList("I am from the caller")
Log.d("~~~", "testReturnAllList:$testReturnAllList")
testInterface.testVoid()
override fun onConnectRaServicesFailed()
Log.d("~~~", "onConnectRaServicesFailed: ")
override fun onDisconnectedFromRaServices(@DisconnectedReason disconnectedReason: Int)
Log.d("~~~", "disconnectedFromRaServices: $disconnectedReason")
)
服务端
-
- 继承
BaseConnectionService
- 继承
-
- 实现
RaTestInterface
接口
- 实现
服务端示例
class RaConnectionService : BaseConnectionService(), RaTestInterface
override fun testReturnAModel(testString: String, testNumber: Int): RaTestModel
Log.d("~~~", "[SERVER] testReturnAModel: Service is invoked, testString:$testString, testNumber:$testNumber")
return RaTestModel("服务端返回新的ID")
override fun testReturnAllList(testString: String): List<RaTestModel>
Log.d("~~~", "[SERVER] testReturnAllList: Service is invoked")
return arrayListOf(RaTestModel("新接口返回的服务端返回新的ID"))
override fun testVoid()
Log.d("~~~", "[SERVER] testVoid: Service is invoked")
一些说明和TODO
- 推荐使用协程的方式调用,因为协程方式的默认内部走异步逻辑,某些情况性能更佳;
- 非协程且方法带有返回值,默认走同步逻辑,调用在那个线程,任务就在那个线程执行;
- 非协程且方法不带返回值,默认走异步逻辑,远程任务永远在子线程中运行 且 排队;
注意(参数或返回值为基本类型【包含String】无需关心)
- 当参数是对象的时候,该对象必须实现Parcelable接口;
- 当客户端期望的接口的返回值是对象的时候,该对象必须实现Parcelable接口;
- 接口如果有返回值,但是如果远程调用失败,返回值为空,请注意「空指针」异常;
例如: 该接口fun testReturnAModel(testString: String, testNumber: Int): RaTestModel
中的RaTestModel
需要实现Parcelable,且服务端和客户端都需要定义相同包名的类;
以上是关于Android好用的进程间通信框架-RAMessage的主要内容,如果未能解决你的问题,请参考以下文章
饿了么开源项目Hermes:新颖巧妙易用的Android进程间通信IPC框架
饿了么开源项目Hermes:新颖巧妙易用的Android进程间通信IPC框架