栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

Android好用的进程间通信框架-RAMessage

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Android好用的进程间通信框架-RAMessage

一个类似Retrofit的IPC通信框架,支持Java、Kotlin以及同步调用、异步调用、协程

一个高可用、高维护、高性能、线程安全的IPC通信框架。(Android全平台支持,仅98kb) 核心思路是hook了Handler中的Messenger实现;(服务端目前需要有反射hide的API的能力,否则功能会降级)

  • Kotlin 
  • Java 
  • Android 4 - Android 12+ 
  • 同步调用 
  • 异步调用 
  • 线程安全 
  • 一个服务端对多客户端 
  • 协程 
  • 支持接口参数、返回参数为:基本类型或实现了Parcelable或List 
  • 提醒消息 (WIP)
  • 异常机制 (WIP)
如何使用 客户端
    1. 先在客户端定义想要IPC的接口;
interface RaTestInterface {
    fun testReturnAModel(testString: String, testNumber: Int): RaTestModel?
    fun testReturnAllList(testString: String): List?
    fun testVoid()
    fun testBoolean(): Boolean
    fun testString(): String
    fun testSendString(testString: String): String

    // 推荐使用
    suspend fun suspendFun(): Boolean
} 
    1. 在客户端绑定远程服务成功后,通过 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")
    }
}) 
服务端
    1. 继承BaseConnectionService
    1. 实现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 {
        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,且服务端和客户端都需要定义相同包名的类;

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/947073.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号