Android android.os.DeadObjectException aidl通信异常分析及解决

问题描述

做一款音乐播放应用,播放服务是通过AIDL形式对外暴露,允许跨进程调用且多个App同时操作音乐播放,偶现android.os.DeadObjectException问题

12-15 09:28:12.371: W/System.err(5412): android.os.DeadObjectException
12-15 09:28:12.372: W/System.err(5412): 	at android.os.BinderProxy.transactNative(Native Method)
12-15 09:28:12.372: W/System.err(5412): 	at android.os.BinderProxy.transact(Binder.java:496)

问题分析

在使用aidl进行进程间通信时,有时候在客户端调用服务端的接口会抛出DeadObjectException异常,原因一般是由于某种原因服务端程序崩溃重启或者服务对象由于内存紧张被回收导致的

问题解决

方案1

针对应用开发,可以在服务端进程启动的时候发个消息给客户端,客户端收到消息的时候重新进行绑定操作,目的是为了同步客户端和服务端的连接,客户端进程启动的时候也要绑定一次(注:在已经连接的情况下,服务端由于某种原因进程重启了,如果客户端没有收到回调,客户端保存的连接不为空,这时调用服务端接口就会抛出DeadObjectException异常)

方案2

调用的对象不存在,因为它所在App进程不存在或进程崩溃,此时在底层回调时报错。

那么在调用对象之前,建议检查是否存在此进程。DeadObjectException异常出现是因为App进程不存在或进程崩溃因此在底层回调时报错。进程不存在或者进程崩溃需要查看其他日志来定位。对于进程崩溃的情况,也有可能部分原因是由于操作系统考虑到内存、CPU、优先级等指标,选择杀死一个进程得到资源。

  ActivityManager activityManager = (ActivityManager) this.getSystemService(Context.ACTIVITY_SERVICE);
List<ActivityManager.RunningAppProcessInfo> pidsTask = activityManager.getRunningAppProcesses();for(int i = 0; i < pidsTask.size(); i++) {nameList.add(pidsTask.get(i).processName);idList.add(pidsTask.get(i).uid);}If(nameList.contains(“processName”)){// 进程存在}else{// 进程不存在}

方案2

进行死亡监听
1)在调用服务端接口的时候先进行判断bind是否还活着

if (mIMyAidlInterface != null && mIMyAidlInterface.asBinder().isBinderAlive()) {try {mIMyAidlInterface.startRecord();} catch (Exception e) {Log.e(TAG, "Exception");e.printStackTrace();}
}

2)注册死亡代理

private IBinder.DeathRecipient mDeathRecipient = new IBinder.DeathRecipient() {@Overridepublic void binderDied() {                           // 当绑定的service异常断开连接后,自动执行此方法Log.e(TAG,"binderDied " );if (mIMyAidlInterface != null){// 当前绑定由于异常断开时,将当前死亡代理进行解绑        mIMyAidlInterface.asBinder().unlinkToDeath(mDeathRecipient, 0);//  重新绑定服务端的servicebindService(new Intent("com.service.bind"),mMyServiceConnection,BIND_AUTO_CREATE);      }}
};

3)在service绑定成功后,调用linkToDeath()注册进service,当service发生异常断开连接后会自动调用binderDied()

public void onServiceConnected(ComponentName name, IBinder service) {          //绑定成功回调Log.d(TAG, "onServiceConnected");mIMyAidlInterface = IMyAidlInterface.Stub.asInterface(service);     //获取服务端提供的接口try {// 注册死亡代理if(mIMyAidlInterface != null){Log.d(TAG, mIMyAidlInterface.getName());service.linkToDeath(mDeathRecipient, 0); }       } catch (RemoteException e) {e.printStackTrace();}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/840346.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

乡村振兴与乡村文化传承创新:保护和传承乡村文化,推动乡村文化创新发展,打造具有文化魅力的美丽乡村

一、引言 在当代中国&#xff0c;乡村振兴已成为国家发展的重要战略之一。乡村不仅是自然资源的富集地&#xff0c;更是中华优秀传统文化的发源地。保护和传承乡村文化&#xff0c;推动乡村文化创新发展&#xff0c;对于打造具有文化魅力的美丽乡村&#xff0c;实现乡村全面振…

SSMP整合案例第三步 业务层service开发及基于Mybatis的接口功能拓展

业务层开发 对于业务层的制作有个误区 Service层接口定义与数据层接口定义具有较大差别 不要混用 业务层接口关注的是业务名称 数据层接口关注的是数据层名称 操作是不难 但是有些东西还是要掌握的 业务层接口如果是业务方法 就按照业务名称来代替 如果是数据操作 直接用…

本地部署Whisper实现语言转文字

文章目录 本地部署Whisper实现语言转文字1.前置条件2.安装chocolatey3.安装ffmpeg4.安装whisper5.测试用例6.命令行用法7.本地硬件受限&#xff0c;借用hugging face资源进行转译 本地部署Whisper实现语言转文字 1.前置条件 环境windows10 64位 2.安装chocolatey 安装chocol…

【调试笔记(目录)】

调试笔记-系列文章目录 第一章 Windows 环境 [1001] 使用VS2019编译edk2&#xff08;上&#xff09; [1002] 使用VS2019编译edk2&#xff08;下&#xff09; [1003] 调试 ExdiGdbSvr [1004] WSL 修改已安装发行版名称 [1005] 配置 QEMU/x86_64 运行 OpenWrt-23.05 发行版并搭…

mysql驱动版本变更导致查询数据结果一直是空

1 引言 最近接手了一个已离职同事的java项目&#xff0c;这个项目中原来使用了自己的mysql驱动版本&#xff0c;并未使用公司公共依赖中的版本号。我想为了统一版本号&#xff0c;就将当前项目中pom文件中mysql的版本号verson给去除了。没怎么自测&#xff0c;就直接发到测试环…

零基础学Java第二十二天之IO流之内存流,打印流,随机流

IO流之内存流&#xff0c;打印流&#xff0c;随机流 1、内存流 1、理解 内存流"&#xff08;Memory Stream&#xff09;在计算机编程中通常指的是一种特殊的数据流&#xff0c;它在内存中存储和操作数据&#xff0c;而不是在外部存储&#xff08;如硬盘、网络等&#xf…

申请轻纺行业工程设计资乙级对企业有什么要求

注册资金&#xff1a;企业的注册资金应至少达到三百万&#xff0c;这是衡量企业经济实力和承担风险能力的重要指标。独立法人资格&#xff1a;企业应具备独立的法人资格&#xff0c;能够独立承担民事责任&#xff0c;并具备相应的经营自主权。专业技术人员配备&#xff1a;企业…

前端框架选择指南:React vs Vue vs Angular

选择前端框架时&#xff0c;React、Vue 和 Angular 都是流行的选择&#xff0c;各有优缺点。我们可以从各个维度进行比较和选择&#xff1a; React 核心理念&#xff1a; 组件化开发&#xff0c;专注于视图层。学习曲线&#xff1a; 相对平缓&#xff0c;因为重点在于JSX和组…

免费的八字软件

无敌八字排盘软件完全免费使用&#xff0c;即使用不需要付费且无任何限制。同时推出手机版电脑版&#xff0c;两版本数据互通互用&#xff0c;即电脑版的数据可以备份到手机版上导入&#xff0c;手机版的数据也可以备份到电脑版上恢复导入&#xff0c;方便手机和电脑共用的朋友…

Golang实现递归复制文件夹

代码 package zdpgo_fileimport ("errors""os""path/filepath""strings" )// CopyDir 复制文件夹 // param srcPath 源文件夹 // param desPath 目标文件夹 // return error 错误信息 func CopyDir(srcPath, desPath string) error {…

在Java中实现泛型(Generics)的深入解析

在Java中&#xff0c;泛型&#xff08;Generics&#xff09;是一个强大的工具&#xff0c;它允许我们在编译时定义类型参数&#xff0c;使代码更加灵活、可重用和类型安全。下面&#xff0c;我将从技术难点、面试官关注点、回答吸引力以及代码举例四个方面&#xff0c;详细解析…

Android-自定义三角形评分控件

效果图 序言 在移动应用开发中&#xff0c;显示数据的方式多种多样&#xff0c;直观的图形展示常常能带给用户更好的体验。本文将介绍如何使用Flutter创建一个自定义三角形纬度评分控件&#xff0c;该控件可以通过动画展示评分的变化&#xff0c;让应用界面更加生动。 实现思…

转行3年涨薪300%,我总结了一套产品经理快速入门指南!

想转行的产品小白&#xff0c;初期一定会遇到这个问题——我要如何 0 基础转行产品经理&#xff1f; 要想 0 基础快速转行产品经理&#xff0c;我通过个人实践总结了 5 个关键点&#xff0c;可以参考。 一、熟悉产品经理的工作全流程 转行的产品小白&#xff0c;首先要建立产…

【刷题日记】最长连续序列

题目描述 给定一个未排序的整数数组 nums &#xff0c;找出数字连续的最长序列&#xff08;不要求序列元素在原数组中连续&#xff09;的长度。 请你设计并实现时间复杂度为 O(n) 的算法解决此问题 实现思路 核心要素两点&#xff1a; 1、当前元素的前驱是否在这个数组中&a…

ABtest假设检验知识|配对检验|比率检验|单向表-列联表检验

文章目录 1 假设检验基础2 一般假设检验2.1 假设检验包2.2 sample - 点击转化率2.2.1 问题描述2.2.2 实验设计2.2.3 数据处理2.2.4 方差齐性检验2.2.5 假设检验2.2.6 结果分析 3 检验两个均值的差&#xff1a;配对3.1 大样本检验3.1.1 单侧检验3.1.2 双侧检验 3.2 小样本检验3.…

【大模型】(记一面试题)使用Streamlit和Ollama构建PDF文件处理与聊天机器人应用

【大模型】(记一面试题)使用Streamlit和Ollama构建PDF文件处理与聊天机器人应用 我在找工作的过程中&#xff0c;遇到一个面试题&#xff1a;搭建一个简易的利用大型 LLM 和 RAG 来实现用户与PDF文件的自然语言交互。 参考链接&#xff1a;https://medium.com/the-ai-forum/ra…

深入理解软件测试:单元测试、集成测试与系统测试

软件测试是软件开发过程中至关重要的一环&#xff0c;旨在确保软件产品的质量和可靠性。根据测试的范围和目标&#xff0c;软件测试可以分为不同的层次和类型&#xff0c;其中最常见的包括单元测试、集成测试和系统测试。下面详细介绍这三种测试类型。 ### 1. 单元测试&#x…

【Python】—— 高阶函数

目录 &#xff08;一&#xff09;体验高阶函数 &#xff08;二&#xff09;内置高阶函数 2.1 map(&#xff09; 2.2 reduce() 2.3 filter() Python中的高阶函数是指那些接受函数作为参数&#xff0c;或者返回函数作为结果的函数。这种特性让Python的函数编程能力非常强大&…

三生随记——关于工地的恐怖故事

夜色中&#xff0c;月光斑驳地洒落在那片荒凉的工地。高耸的钢筋骨架如同巨大的怪兽&#xff0c;在黑暗中矗立着&#xff0c;散发着令人不安的气息。这里曾是城市的繁华之地&#xff0c;但如今却成了一片废墟&#xff0c;充满了无尽的恐怖和神秘。 工地四周被铁丝网围了起来&am…

Flutter 中的 GlowingOverscrollIndicator 小部件:全面指南

Flutter 中的 GlowingOverscrollIndicator 小部件&#xff1a;全面指南 Flutter 的 GlowingOverscrollIndicator 是一个视觉效果引人注目的组件&#xff0c;用于在列表或网格滚动超出其内容大小时提供视觉反馈。这种组件通常以发光效果指示用户已经滚动到了末端或超出了内容区…