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();}
}
相关文章:
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:…...
dp + 计数,1954D - Colored Balls
一、题目 1、题目描述 2、输入输出 2.1输入 2.2输出 3、原题链接 Problem - 1954D - Codeforces 二、解题报告 1、思路分析 本题前置题目: 1953. 你可以工作的最大周数 通过前置题目可以知道如何计算两两不同数对序列的最大长度 我们记最大数量为ma…...
【设计模式深度剖析】【5】【结构型】【桥接模式】| 以电视和遥控器为例加深理解
👈️上一篇:组合模式 设计模式-专栏👈️ 目 录 桥接模式(Bridge Pattern)定义英文原话是:直译理解 4个角色UML类图代码示例 应用优点缺点使用场景 示例解析:电视和遥控器UML类图 桥接模式(Bridge Pattern) 定义 英文原话是&am…...
一键安装脚本sh
首先是初始化的ros安装的一些库; install.sh: execute_command() {if [ "$1" "1" ]; thenwget http://fishros.com/install -O fishros && bash fishroselif [ "$1" "2" ]; then#gnome-terminal --title"n…...
WebGL在医学成像方面的应用
WebGL(Web Graphics Library)是一种用于在Web浏览器中呈现3D和2D图形的JavaScript API。它被广泛应用于各种领域,包括医学成像。以下是WebGL在医学成像方面的应用及其详细描述。北京木奇移动技术有限公司,专业的软件外包开发公司&…...
SpringBoot+layuimini实现角色权限菜单增删改查(layui扩展组件 dtree)
角色菜单 相关组件方法效果图MySQL代码实现资源菜单树组件实现权限树方法js这里我先主要实现权限树的整体实现方法,如果是直接查看使用的话可以只看这里! 后端代码Controlle层代码Service代码及实现类代码Service代码ServiceImpl代码 resourceMapper 代码…...
项目范围管理
目录 1.概述 2.主要工作 3.基础 4.项目范围管理的过程 5.规划范围管理 6.收集需求 7.定义范围 8.创建 WBS 9.确认范围 10.控制范围 1.概述 项目范围管理是项目管理中的一个重要组成部分,涉及到确定项目需要完成的工作范围,以及如何管理和控制…...
监管端..
文章目录 1. 登录流程2. 日志AOP 1. 登录流程 使用账号(手机号)、密码、验证码。登录就是获取token的,输入的账号密码用RSA加密(非对称) 首先输入账号密码,在发送手机验证码时候先校验账号密码有没有输入…...
点击登录按钮先检测输入框的规则检测(vue组合式)
<template><el-form :model"user" :rules"rules" ref"loginForm" label-width"auto" style"max-width: 600px"><el-form-item label"用户名" prop"name"><el-input v-model"…...
网络工程师---第四十二天
1、基于子网的vlan划分配置步骤是什么? 2、基于端口的vlan划分配置步骤是什么? 3、基于MAC地址的vlan划分配置步骤是什么? 4、请简述无线局域网的组网方式有哪几种,区别是什么? 5、请简述堆叠、级联和集群作用和区别是…...
leetcode 1241每个帖子的评论数(postgresql)
需求 编写 SQL 语句以查找每个帖子的评论数。 结果表应包含帖子的 post_id 和对应的评论数 number_of_comments 并且按 post_id 升序排列。 Submissions 可能包含重复的评论。您应该计算每个帖子的唯一评论数。 Submissions 可能包含重复的帖子。您应该将它们视为一个帖子。…...
前端最新面试题(ES6模块篇)
目录 1 ES5、ES6和ES2015有什么区别? 2 babel是什么,有什么作用? 3 let有什么用,有了var为什么还要用let? 4 举一些ES6对String字符串类型做的常用升级优化? 5 举一些ES6对Array数组类型做的常用升级优化 6 举一些ES6对Number数字类型做的常用升级优化 7 举一些ES…...
STM32H750外设之ADC通道选择
目录 概述 1 通道选择功能介绍 2 通道选择( SQRx、 JSQRx) 2.1 通道复用 2.1.1 通道介绍 2.1.2 通道框图 2.2 转换分组 2.3 内部专用通道 3 通道预选寄存器 (ADCx_PCSEL) 3.1 功能介绍 3.2 预选通道寄存器 概述 本位主要介绍STM32H750外设之…...
【Unity2D 2022:Cinemachine】相机跟随与地图边界
一、导入Cinemachine工具包 1. 点击Window-Package Manager,进入包管理界面 2. 点击All,找到Cinemachine工具包,点击Install 二、相机跟随角色 1. 选中Main Camera,点击Component-Cinemachine-CinemachineBrain,新建…...
ssh远程连接的相关配置
连接同一个局域网下: 正好这里来理解一下计算机网络配置中的ip地址配置细节, inet 172.20.10.13: 这是主机的IP地址,用于在网络中唯一标识一台设备。在这个例子中,IP地址是172.20.10.13。 netmask 255.255.255.240: 这是子网掩码…...
在leafet上画圆、多边形、线、矩形
在leaflet上画圆、多边形、线、矩形 <template><div id"map" class"map"></div> </template><script> import L from leaflet; export default {data () {return {myGroup: ,};},mounted () {this.initMaps()this.huizhiro…...
SpringBoot中如何在服务器进行校验?
数据校验就是数据的合法性检查,在服务器端也可以对数据进行校验,一般使用JSR303 校验 JSR303是Java为Bean数据合法性校验提供的标准框架,是一种声明式校验 JSR303通过在Bean属性上标注类似于NotNull、Max等注解来指定校验规则,并…...
element ui 的el-input输入一个字后失去焦点,需重新点击输入框才能再次输入
解决方案: 我是form表单嵌套表格,里面的el-input输入框,输入第一个值的时候会突然失去焦点,需要再次点击输入框才能正常输入,原因是table的key值,需要改成正常的index即可,如果你是循环的&…...
【绝地求生game】
编写一个完整的《绝地求生》这样的游戏程序代码是一个庞大的工程,涉及到成千上万行的代码和复杂的多模块协作。在这里,我可以提供一个非常简化的示例,用于演示游戏编程中可能用到的基本概念,比如玩家移动、基本物理和简单的游戏逻…...
Mac上Steam安装的游戏已经卸载,但游戏的快捷方式图标仍存在的解决方式
打开终端,输入以下内容,回车。 open ~/Applications 在弹出的窗口中,会列出对应的快捷方式,按需删除即可。 实际上打开的是 /Users/改为你的用户名/Applications 文件夹下的内容。因此也可以通过打开访达(Finder&am…...
探索拖火车混合A星路径规划算法
拖火车混合a星路径规划算法 在路径规划领域,各种算法层出不穷,今天咱就唠唠拖火车混合A星路径规划算法。这算法融合了传统A星算法的优势,并针对特定场景进行了创新,就像是给A星算法穿上了特制的“战衣”,以应对更复杂…...
Linux桌面/usr/share详解
/usr/share 是 Linux 桌面系统中一个极其核心的目录,遵循 FHS(文件系统层次结构标准)。它的核心定位是:存储架构无关的、只读的、应用程序之间共享的数据。简单理解:如果把系统比作一家公司,/usr/share 就是…...
LIS302DL加速度计I²C驱动库LS302i2c详解
1. LS302i2c 库概述:面向嵌入式系统的 LIS302DL IC 加速度计驱动实现LS302i2c 是一个专为 STM32 及兼容 Cortex-M 微控制器设计的轻量级、可移植 IC 接口加速度计驱动库,其核心目标是为 STMicroelectronics 的 LIS302DL 三轴数字加速度传感器提供稳定、低…...
MAX9814麦克风音量LED指示器嵌入式固件库
1. 项目概述MAX9814_Electret_Microphone_LED_Volume_Indicator是一个面向嵌入式音频前端采集与可视化反馈的轻量级固件库,专为 Adafruit MAX9814 电容式驻极体麦克风放大模块设计。该模块基于 Maxim(现为 Analog Devices)推出的低噪声、高增…...
SQLite NULL 值
SQLite NULL 值 SQLite 是一种轻量级的数据库管理系统,广泛用于嵌入式系统和移动应用中。在 SQLite 中,NULL 值是一个非常重要的概念,它表示未知、缺失或不确定的数据。本文将详细介绍 SQLite 中的 NULL 值,包括其定义、处理方法以及优化技巧。 什么是 NULL 值 在 SQLit…...
北京交通大学 | 基于TD3算法的层叠超表面辅助多用户MISO系统联合优化研究
引言随着无线通信技术的不断发展,可重构智能表面(RIS)技术因其低功耗和信号操控能力而受到广泛关注。然而,RIS的单层结构和离散相移能力限制了其性能表现。层叠智能超表面(SIM)作为一项创新技术,…...
大以论文与万方、维普、WPS AI 综合对比(2026)
毕业季论文格式问题频发,手动排版耗时、通用模板不匹配、公式图表易错乱是常态。万方、维普以查重为主,WPS AI 偏向通用办公,而大以论文作为7 年专注毕业论文排版的老牌工具,在专业性、稳定性与院校适配性上更具优势。一、核心对比…...
2025届毕业生推荐的十大AI辅助论文工具解析与推荐
Ai论文网站排名(开题报告、文献综述、降aigc率、降重综合对比) TOP1. 千笔AI TOP2. aipasspaper TOP3. 清北论文 TOP4. 豆包 TOP5. kimi TOP6. deepseek 在开题报告撰写进程当中,人工智能技术能够起到高效辅助功效。其一,凭…...
文书妙笔专为公文写作打造,让写材料效率翻倍
不同于市面上通用型写作工具,文书妙笔每一项功能都为公文写作量身定制,真正实现“写材料效率翻倍”。作为专为公文写作打造的平台,平台内置40W优质公文范文库,每日持续更新,更整合了最新政策表述、基层工作案例和规范金…...
thinkphp8官方文档
以下是ThinkPHP 8官方文档的核心内容和相关资源整理:官方文档入口ThinkPHP 8的官方文档可通过其官网访问,文档地址为:https://www.thinkphp.cn/doc主要文档内容ThinkPHP 8文档包含完整的框架使用指南,涵盖安装、配置、路由、控制器…...
