一、异常原因

在使用aidl进行进程间通信时,有时候在客户端调用服务端的接口会抛出DeadObjectException异常,原因一般是由于某种原因服务端程序崩溃重启或者服务对象由于内存紧张被回收导致的,最近开发的时候遇到过此问题,解决方案有两种,实测有效。

二、解决方案如下两种方案

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

  1. android aidl通信,Android的AIDL通信机制

    Android 接口定义语言 (AIDL) AIDL(Android 接口定义语言)与您可能使用过的其他 IDL 类似. 您可以利用它定义客户端与服务使用进程间通信 (IPC) 进行相互通信时都认可的 ...

  2. Android 关于AIDL通信,RemoteCallbackList实现Server回调Client

    Android 接口定义语言 (AIDL) Android 接口定义语言 (AIDL) 与您可能使用过的其他接口语言 (IDL) 类似.您可以利用它定义客户端与服务均认可的编程接口,以便二者使用进程间 ...

  3. Android进程间通信 深入浅出AIDL(一)

    文中示例代码均可在demo中找到 1. AIDL概念 Android 接口定义语言 (AIDL) 与您可能使用过的其他接口语言 (IDL) 类似.您可以利用它定义客户端与服务均认可的编程接口,以便二者 ...

  4. Android进程间通信 深入浅出AIDL

    文中示例代码均可在demo中找到 1. AIDL概念 Android 接口定义语言 (AIDL) 与您可能使用过的其他接口语言 (IDL) 类似.您可以利用它定义客户端与服务均认可的编程接口,以便二者 ...

  5. Android之使用AIDL时的跨进程回调—Server回调Client

    首先建立在server端建立两个aidl文件 ITaskCallback.aidl 用于存放要回调client端的方法 package com.cmcc.demo.server; interface ...

  6. android ipc 多个客户端,Android IPC之AIDL进阶篇

    前言 在Android IPC之AIDL中我介绍了如何使用AIDL进行多进程通信,不过由于当时个人水平有限,仅仅介绍了最基础的部分,所以本篇博客主要是在Android IPC之AIDL的基础上深入介绍 ...

  7. 实现Android跨进程组件通信能有多简单?

    实现Android跨进程组件通信能有多简单? 作为一个Android开发,都要会点组件化知识.组件化的主要的特点,是剥离依赖,但组件间不直接依赖后,通信问题要怎么解决呢. 通常我们用的一下这种类似Bi ...

  8. Android:学习AIDL,这一篇文章就够了(下)

    前言 上一篇博文介绍了关于AIDL是什么,为什么我们需要AIDL,AIDL的语法以及如何使用AIDL等方面的知识,这一篇博文将顺着上一篇的思路往下走,接着介绍关于AIDL的一些更加深入的知识.强烈建议 ...

  9. android 中的aidl

    1.什么是aidl:aidl是 Android Interface definition language的缩写,一看就明白,它是一种android内部进程通信接口的描述语言,通过它我们可以定义进程间 ...

最新文章

  1. 7.RabbitMQ RFC同步调用
  2. 对超线程几个不同角度的解释
  3. 王者争雄服务器维护,王者争雄_王者争雄官网_攻略-第一手游网
  4. 归并排序执行次数_归并排序过程、时间复杂度分析及改进
  5. 一个美女买裤子的全过程
  6. 蓝桥杯2019年第十届C/C++省赛A组第三题-最大降雨量
  7. HTML:让img标签和input标签水平对齐一样高
  8. 布谷鸟算法的程序(个人注释)
  9. ipad、iphone 怎么真机调试
  10. 安卓应用移植鸿蒙(五):发布鸿蒙自定义组件(har包)到MavenCenter全过程,采坑无数
  11. 四十岁想跳槽,年龄是最大的障碍吗?
  12. 蓝桥杯 平方和(JAVA)
  13. Whitelabel Error Page 解决办法
  14. 一起卷吧,arduino/mixly语音识别模块,10元,可以自定义,提供自制的mixly库
  15. opengl之glScalef()函数
  16. XMPP 协议的原理和介绍
  17. 【软工Work1】四则加减乘除混合运算(带括号、真分数)
  18. 模拟自由落体运动的小球
  19. HTML超详细基础知识总结
  20. USBCNC自动换刀教程

热门文章

  1. 电脑服务器名称怎么修改,怎么修改云服务器计算机名
  2. SCILAB及其在控制系统仿真中的应用
  3. matlab spwm变频调速开环系统电路仿真图,基于MATLABSimulink的开环SPWM变频调速系统仿真.pdf...
  4. RSA由密文解密的奇偶性确定原始明文
  5. WEB前台架构教程(原创)第二章(第一节PS切图规划)
  6. 8.4V,7.4V转6V转5V转3.3V转3V转2.5V转2.4V降压芯片
  7. 北京协和医学院823计算机原理,2017年北京协和医学院基础医学院823计算机原理考研导师圈点必考题汇编...
  8. Spark源码解读1-算子操作
  9. android中热更新模式,热更新再牛,也少不了Android 增量更新
  10. 案例:个税计算器(2019)