Android:解决APP升级后AIDL无法通讯问题

news/2024/11/28 8:11:08/

项目场景:

两个APP使用AIDL跨进程IPC通讯。A为服务端APP,B为客户端APP。


问题描述

现象:A自动升级版本后,无法向客户端B通讯,会打印log“AIDL未连接客户端”,但B可以向A通讯。

实现代码:

class Service{private val mArtAppStub by lazy { newIArtApp() }private val mListeners = RemoteCallbackList<IListenerInterface>()private val mLock = ReentrantLock()/*** 实例化代理*/private fun newIArtApp() = object : IServiceInterface.Stub() {override fun registerListener(listener: IListenerInterface?) {LogUtils.e(mTag, "registerListener:$listener")mListeners.register(listener)}}// ..... 省略若干sendCallback调用代码/*** 发送回调客户端事件* @param sendEvent 发送事件* @param unexe 未执行*/private fun sendCallback(unexe: () -> Unit = {}, sendEvent: (IListenerInterface) -> Unit) {mLock.lock()try {val length = mListeners.beginBroadcast()if(length == 0){LogUtils.e(mTag,"AIDL未连接客户端,请等待连接。。。")unexe()}else{// 只向最后一个监听器通讯sendEvent(mListeners.getBroadcastItem(length - 1))}} catch (e: Throwable) {e.printStackTrace()} finally {mListeners.finishBroadcast()mLock.unlock()}}
}

原因分析:

在A升级后, B自动重新建立aidl连接,并通讯:
以下为服务端log

启动服务init
启动服务onCreate
回复客户端 数据 ...
启动服务init
启动服务onCreate

可以看到这里service被启动了两次,如果多次升级,也相应增加启动次数,这样会导致内部变量mListeners也被实例化了多次,里面存储的客户端listener也不在了,所以回调客户端时 找不到任何的listener。


解决方案:

我们可以将mListeners提取为APP生命周期的全局变量,作为共享数据;这样无论service重复创建多少次都不会受影响,同时也可以正常通讯;
修改后的代码如下:

class Service{companion object{/** 回调客户端的监听 */private val mListeners = RemoteCallbackList<IListenerInterface>()}// 将此处移至伴随对象内。//    private val mListeners = RemoteCallbackList<IListenerInterface>() 
}

http://www.ppmy.cn/news/825726.html

相关文章

OSG三维渲染引擎编程学习之九十二:“第九章:OSG动画” 之 “9.3 动画路径导出”

目录 第九章 OSG动画 9.3 动画路径导出 第九章 OSG动画 在游戏或一些演示中,动画的渲染会非常重要,同时也应添加更多的娱乐与互动,一个非常绚丽和真实的动画会用一个引擎让人刮目相看。目前,骨骼动画是一项比较高级的动画技术,它的显示效果也非常逼真。 本章将主要介绍O…

西安历史美食休闲三日游【规划】

本来打算这个暑假去西安的玩的&#xff0c;后来又改变主意。这篇行程安排是写给队友谢罪的。。。各位简友有什么推荐的欢迎留言~~~ DAY 1: 陕西历史博物馆大雁塔景区 DAY 2 华清宫骊山秦始皇陵兵马俑 DAY 3 明城墙钟鼓楼回民街书院门 DAY 1: 陕西历史博物馆大雁塔景区 早餐自理…

设计模式之抽象工厂模式学习笔记

前言 在学习抽象工厂模式之前&#xff0c;最好先学习了解简单工厂模式和工厂方法模式。这样会对学习抽象工厂模式有帮助&#xff0c;因为抽象工厂模式也是基于工厂方法模式的。 解释 说白了就是工厂的工厂&#xff0c;以一个超级工厂为核心&#xff0c;围绕这个超级工厂去创…

设计模式之工厂方法模式学习笔记

定义 定义一个用于创建对象的接口&#xff0c;让子类去决定是实现哪个类。工厂方法使类的实例化&#xff0c;延迟到了子类。 结构图 角色拆解分析&#xff1a; 1.Product&#xff1a;抽象产品类 2.ConcrereProduct&#xff1a;具体产品类&#xff0c;实现Product接口 3.Fact…

设计模式之简单工厂模式学习笔记

前言 简单工厂模式&#xff0c;又叫做静态工厂方法模式。属于创建型工厂模式&#xff0c;但是不属于23中设计模式。学习简单工厂模式&#xff0c;是为了更好地学习工厂方法模式。 定义 简单工厂模式&#xff0c;即静态工厂方法模式&#xff0c;是由一个工厂对象决定创建出哪…

设计模式之建造者模式学习笔记

前言 建造者模式也叫生成器模式&#xff0c;是创建一个复杂对象的创建型模式&#xff0c;将此创建过程和部件解耦&#xff0c;使其构建过程和部件的表示分离开。 解释 建造者模式&#xff0c;说白了就是“攒机”。比方说我想要定制一台笔记本电脑&#xff0c;我要求固态必须…

Java数据结构与算法05——多图读懂双向链表

标签&#xff08;空格分隔&#xff09;&#xff1a; Java 数据结构 算法 作者 &#xff1a; Maxchen 版本 &#xff1a; V1.0.0 日期 &#xff1a; 2020/4/27 目录 什么是双向链表&#xff1f;为什么会使用它&#xff1f;双向链表的几个常规操作1、创建链表2、遍历链表3、新…

Java数据结构与算法04——单向链表

标签 &#xff1a; Java 数据结构 算法 作者 &#xff1a; Maxchen 版本 &#xff1a; V1.0.1 日期 &#xff1a; 2020/4/2 目录 1.单向链表——原理2.单向链表——代码实现2.1单向链表——新增与查询2.2单向链表——修改2.3单向链表——删除 3.单向链表——整体代码 1.单向…