AIDL通信过程中设置死亡代理

2024-01-09

概述

在进行进程间通信的过程中,如何服务端进程由于某种原因异常终止,我们的远程调用就会失败,影响我们的功能,那么怎么样能够知道服务端进程是否终止了呢,那就是给Binder设置死亡代理,下面看看如何设置。

   @Override
        public void onServiceConnected(ComponentName name, IBinder service) {
            Log.d(TAG, "onServiceConnected: " + name +"--service--" + service);
            mBookManager = IBookManager.Stub.asInterface(service);
            Log.d(TAG, "mBookManager: " + Thread.currentThread().getName());
            mBound = true;
            if (mBookManager != null) {
                Book book = new Book(1,"AA");
                try {
                    mBookManager.addBook(book);
                    //设置死亡代理
                    mBookManager.asBinder().linkToDeath(mDeathRecipient,0);
                    for (Book book2 : mBookManager.getBookList()) {
                        Log.d(TAG, "onServiceConnected: " + book2);
                    }
                } catch (RemoteException e) {
                    e.printStackTrace();
                }
            }
        }
 
        @Override
        public void onServiceDisconnected(ComponentName name) {
            mBound = false;
        }
    };
 
    private IBinder.DeathRecipient mDeathRecipient = new IBinder.DeathRecipient() {
        @Override
        public void binderDied() {
            if (mBookManager == null) return;
            mBookManager.asBinder().unlinkToDeath(mDeathRecipient,0);//解除死亡通知,如果Binder死亡了,不会在触发binderDied方法
            mBookManager = null;
        }
    };

在onServiceConnected连接到远程服务以后,我们通过AIDL接口的asBinder方法获取到Binder对象,然后·调用linkToDeath
方法为其设置一个死亡代理DeathRecipient对象,这个对象有一个binderDied方法,当服务端进程异常终止,而我们尝试去绑定的时候,就会回调这个方法,我们可以在这个方法中进行对应的处理,例如重新绑定远程服务等。

另外,通过Binder中的下面两个方法,也可以判断

/**//检查Binder对象是否存在
     * Check to see if the object still exists.
     * 
     * @return Returns false if the
     * hosting process is gone, otherwise the result (always by default
     * true) returned by the pingBinder() implementation on the other
     * side.
     */
    public boolean pingBinder();
 
    /**//检查Binder所在的进程是否存活
     * Check to see if the process that the binder is in is still alive.
     *
     * @return false if the process is not alive.  Note that if it returns
     * true, the process may have died while the call is returning.
     */
    public boolean isBinderAlive();

注意:如果你调用的是本地Binder,那么isBinderAlive方法永远返回true,因为你能调用Binder,说明你的进程肯定是存在的。


其他问题


1.当服务端进程终止时,如果我们客户端退出时(不是退到后台),会出现如下的异常信息

意思是Service连接泄漏,那是因为我们没有在当前页面退出时解除绑定,正确的写法如下

  @Override
    protected void onDestroy() {
        super.onDestroy();
        unbindService(mBookConnection);//页面销毁的时候接触原来绑定的服务
    }


2.当我们通过下面的方式去绑定远程服务时,会出错

Intent intent = new Intent("com.lxn.getbook");
bindService(intent,mBookConnection,BIND_AUTO_CREATE);


错误信息如下

意思是说Service的Intent必须是显式的,这是因为 Android5.0中service的intent一定要显性声明, 当这样绑定的时候不会报错,正确写法如下

Intent intent = new Intent("com.lxn.getbook");
intent.setPackage("com.example.server");//指定Service进程所在的包名
bindService(intent,mBookConnection,BIND_AUTO_CREATE);


————————————————
版权声明:本文为CSDN博主「lxn_李小牛」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/small_lee/article/details/79181985

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

AIDL通信过程中设置死亡代理 的相关文章

  • messages,CentOS 7不收集日志或不存在 /var/log/messages

    var log message var log secure等都不记录了 并且都是空文件 重启机器 reboot 无效 重启日志 systemctl start rsyslog 无效 怀疑空间不足 删除 var log messages 重
  • 远程控制软件安全吗?一文看懂ToDesk、RayLink、TeamViewer、Splashtop相关安全机制_raylink todesk

    目录 一 前言 二 远程控制中的安全威胁 三 国内外远控软件安全机制 ToDesk RayLink Teamviewer Splashtop 四 安全远控预防 一 前言 近期 远程控制话题再一次引起关注 据相关新闻报道 不少不法分子利用远程
  • Kubernetes (十二) 存储——Volumes配置管理

    一 卷的概念 官方地址 卷 Kubernetes https v1 24 docs kubernetes io zh cn docs concepts storage volumes 二 卷的类型及使用 emptyDir卷 1 创建编辑文件
  • 是否可以像IPC一样使用Mac OS X XPC在进程之间交换消息?如何?

    据 Apple 介绍 Lion 中引入的新 XPC Services API 为与 Grand Central Dispatch GCD 和 launchd 集成的基本进程间通信提供了一种轻量级机制 似乎可以使用这个 API 作为一种 IP
  • 内网安全:隧道技术详解

    目录 隧道技术 反向连接技术 反向连接实验所用网络拓扑图及说明 网络说明 防火墙限制说明 实验前提说明 实战一 CS反向连接上线 拿下Win2008 一 使用转发代理上线创建监听器 二 上传后门执行上线 隧道技术 SMB协议 SMB协议介绍
  • 【安全】简单解析统一身份认证:介绍、原理和实现方法

    深入解析统一身份认证 介绍 原理和实现方法 导语 统一身份认证是什么 统一身份认证的原理 统一身份认证的实现 结语 导语 随着互联网的发展和各种在线服务的普及 用户在不同的应用和平台上需要进行多次身份验证 为了简化用户的登录和减少重复操作
  • 在 C++ 中创建 Windows 命名管道

    我正在尝试在 C Windows 中创建两个进程之间的简单通信 就像 Linux 中的 FIFO 一样 这是我的服务器 int main HANDLE pipe CreateFile TEXT pipe Pipe GENERIC READ
  • 共享内存和IPC [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我正在阅读有关共享内存的教程 发现以下陈述 如果一个进程希望通知另一个进程新数据已插入共享内存 则必须使用信号 消息队列 管道 套接字
  • IPC::Run - 检测早产儿退出和关闭管道

    我想使用 IPC Run 通过孩子的 STDIN STDOUT 和 STDERR 开始 泵送 完成 与孩子进行通信 似乎有效 我想知道如何检测 儿童过早退出 例如由错误引起 水管被孩子关闭 The pump抛出一个die出现错误时 或将其消
  • 如何用IPC::Open2过滤大量数据?

    我的任务是使用外部实用程序 addr2line 从 perl 脚本中过滤一些数据 数据量相当大 我需要打印大量数据stdin程序并读回大量数据 来自stdout程序到我的脚本中 现在我这样做IPC Open2 但我不混合阅读和写作 这合法吗
  • 将管道/连接作为上下文参数传递给多处理 Pool.apply_async()

    我想使用管道与池中的流程实例进行通信 但出现错误 让 p 成为 Pool 的一个实例 master pipe worker pipe Pipe self p apply async worker task handler info cont
  • MPI_Send() 和 MPI_Ssend() 之间的区别?

    I know MPI Send 是一个阻塞调用 它会等待直到可以安全地修改应用程序缓冲区以供重用 为了使发送调用同步 应该与接收者握手 我们需要使用MPI Ssend 我想知道两者之间的区别 假设我需要在进程之间发送固定数量的字节 哪一个应
  • NamedPipe 多个服务器

    对于简单的 IPC 我选择了 NamedPipes 在进程 本地 之间进行通信 由于需求的变化 应该有多个服务器实例 这会导致同一管道名上有多个 侦听器 但似乎有一个问题 这些侦听器中只有一个会收到消息 其他所有实例都不会收到消息 有某种
  • 带有 Python 子进程的 IPC

    我正在尝试在 Python 中执行一些简单的 IPC 如下所示 一个 Python 进程启动另一个进程subprocess 子进程将一些数据发送到管道中 父进程接收它 这是我当前的实现 parent py import pickle imp
  • Python/POpen/gpg:通过标准输入或文件描述符提供密码和加密文本

    我正在尝试通过 python 程序远程控制 gpgPOpen 我有一个包含加密数据的文件 我想对其进行解密 修改并重新加密写回磁盘 目前我将解密的信息存储在一个临时文件中 我shred当程序结束时 然后我对该文件进行修改 然后使用一个函数重
  • Java中如何通知特定线程

    如何在线程间通信中调用特定线程 在下面的程序中我有两个线程t1 and t2 当我打电话时t1 notify 它提出 Exception in thread Thread 1 java lang IllegalMonitorStateExc
  • 尝试使用 POSIX 消息队列创建消息队列时权限被拒绝

    我正在使用以下代码片段创建一个消息队列Linux 编程接口 http man7 org tlpi if mq open my message queue O CREAT O RDWR NULL 1 perror mq creation fa
  • 简单(但具体)的侦听器和发送器 Python 3 DBus 示例

    我想制作一个由两部分组成的程序 一个监听者 服务器 如果你愿意的话 和一个发送者 客户端 我做了一些研究 了解到这是通过程序员调用 IPC 进程间通信 的方法来完成的 我相信您知道它的意思 我只是扩展了缩写词 以便您知道我不认为它意味着 互
  • 使用 WM_COPYDATA 在进程之间发送数据

    我希望在进程之间发送文本 我发现了很多这样的例子 但没有一个我可以工作 这是我到目前为止所拥有的 对于发送部分 COPYDATASTRUCT CDS CDS dwData 1 CDS cbData 8 CDS lpData NULL Sen
  • 从一个 Nodejs 应用程序调用另一个 Nodejs 应用程序中的 API 的方法

    我们的应用程序将有一个网站和一个移动应用程序 两者都与同一个 API 后端进行通信 我有一个仅提供 API 服务的 Nodejs 应用程序 还有一个为网站提供 html 页面服务的 Nodejs 应用程序 我正在为这两个应用程序使用 Exp

随机推荐

  • 如何处理不稳定的自动化测试?

    abluecolor 在解决这个问题之前 请停止编写更多测试 因为这将花费你较高的测试维护成本 你需要尽快行动起来对不稳定的原因进行深入研究 找到不稳定的根因 并且尝试在流程 环境和代码方面做一些优化工作解决它 MasterKindew 如
  • mybatisPlus 将List<String>字段转成json字符串,使用JacksonTypeHandler以及自定义类型处理器实现

    文章目录 场景 使用JacksonTypeHandler实现类型转换 自定义StringListTypeHandler处理器实现 场景 项目中经常需要将List转成json存储到配置文件中 mybatisPlus默认实现了JacksonTy
  • Stable Diffusion运行时自动重启的小程序

    Stable Diffusion在运行过程中 常常因为各种原因导致服务挂掉 所以希望能定时检查程序是否存活 如果dead则重启一下 思路 stable diffusion运行时需要使用GPU 如果GPU没有在用 并且GPU对应的进程也找不到
  • 多进程之Binder的意外死亡及权限校验

    Android多进程系列 Android 多进程通讯之几个基本问题 Android多进程之Binder的使用 Android多进程之手动编写Binder类 Android多进程之Binder解绑监听的问题 Android 多进程之Messe
  • 毕设开题分享 单片机智能教室系统(智能照明+人数统计)

    1 简介 Hi 大家好 今天向大家介绍一个学长做的单片机项目 单片机智能教室系统 智能照明 人数统计 大家可用于 课程设计 或 毕业设计 项目分享 https gitee com feifei1122 simulation project
  • Ubuntu下git提示:终止提交因为提交说明为空。

    这么简单的问题居然搜索了一会儿 现在的网络环境越来越差了 解决方法 gedit git config global core editor gedit s the paramater s means set the gedit mode t
  • 使用匿名binder实现client向server端的死亡通知

    一 引言 因为binder是跨进程通信 难免会遇到服务端出现异常挂死的情况 这个时候需要通知到客户端进行相应的处理 在网络通信中是非常常见的机制 当然 在binder中 Android也为我们写好了相关的框架 但通过binder源码分析 你
  • IBinder 解析

    远程对象的基础接口 是一个为了在执行进程中和进程间调用时的高性能 而设计的轻量级 远程调用 机制的核心部分 这个接口描述了和远程对象交互的抽象协议 不要直接实现这个接口 而是通过继承 Binder 来实现 IBinder的关键 API 是与
  • 如何避免过度努力带来的负面影响

    在快节奏的现代职场中 我们经常听到关于 努力 的话题 有些人认为 只有通过不断地努力和投入 才能够获得成功 然而 如果过度用力 可能会带来一些负面影响 本文将探讨职场中过度用力的负面影响以及如何避免这些问题 首先 让我们来看一下过度用力的负
  • Mockito3.x详解

    目录 Mockito 1 简单示例 2 打桩测试 3 参数匹配器 4 调用次数验证 5 通过打桩为无返回值函数抛出异常 6 验证调用顺序 7 验证从未发生过的交互
  • 手写转文字扫描软件有哪些?方便又好用的工具谁不喜欢?

    大家有没有仔细数过 你们在从小到大的学习生涯中使用了多少笔记本 反正我是经常被我妈催着把以前的笔记本丢掉 但是它们承载的可都是我学生时代的记忆 就连当时觉得复杂难懂的内容 其实也挺有意思的 所以 我一直在思考 到底有什么方法可以让我在不占用
  • Binder机制知识点

    引言 在Android领域 Binder作为进程间通信的核心机制 是每位Android技术人员都应该深入了解的重要知识点 本文将从面试官的角度出发 围绕Android Binder展开一系列高级疑难问题 通过问题分析与问题简答 旨在帮助大家
  • 静态关键字:static

    static的作用 static是静态的意思 可以修饰成员变量和成员方法 static修饰成员变量表示该成员变量只在内存中只存储一份 可以被共享访问 修改 成员变量 分为2类 静态成员变量 有static修饰 属于类 内存中加载一次 常表示
  • 性能分析与调优: Linux 内存观测工具

    目录 一 实验 1 环境 2 vmstat 3 PSI 4 swapon 5 sar 6 slabtop 7 numstat 8 ps 9 top 10 pmap 11 perf 12 bpftrace 二 问题 1 接口读写报错 2 sl
  • 校招失败后,在小公司熬了 2 年终于进了字节跳动,竭尽全力....

    其实两年前校招的时候就往字节投了一次简历 结果很明显凉了 随后这个理想就被暂时放下了 但是这个种子一直埋在心里这两年除了工作以外 也会坚持写博客 也因此结识了很多优秀的小伙伴 从他们身上学到了特别多东西 把这次面试分享出来 也是希望可以帮助
  • Android studio Progress Bar 进度条应用设计

    一 水平进度条 1 xml布局文件 2 java文件 progressBar1 findViewById R id progressBar progressBar2 findViewById R id progressBar2 public
  • Android App备案获取公钥、签名MD5值

    1 生成签名文件 keytool genkey alias 别名XXX keypass 密码XXX keyalg RSA keysize 2048 validity 36500 keystore D XXX keystore storepa
  • jquery的contains如何实现精准匹配

    HTML结构
  • Android studio SeekBar应用设计

    一 xml布局文件 1 默认状态的
  • AIDL通信过程中设置死亡代理

    概述 在进行进程间通信的过程中 如何服务端进程由于某种原因异常终止 我们的远程调用就会失败 影响我们的功能 那么怎么样能够知道服务端进程是否终止了呢 那就是给Binder设置死亡代理 下面看看如何设置 Override public voi