Binder双向通信实验2 ---- 客户端死亡, 看服务端是否能正常调用callback

继续上一篇 Binder双向通信-CSDN博客 , 修改下demo,RemoteService加一个定时器,服务端进程的主线程每3秒调用一下callback的onResult。增加的这段代码如下:

java 复制代码
    private final android.os.Handler handler =
            new android.os.Handler(android.os.Looper.getMainLooper());

    private final Runnable tick = new Runnable() {
        @Override
        public void run() {
            Log.d(TAG, "tick, callbacks.size=" + callbacks.size());
            for (ICallback cb : callbacks) {
                try {
                    cb.onResult(999);
                    Log.d(TAG, "tick onResult success. \n不错!我就是美貌与智慧并重,英雄与侠义的化身唐伯虎");
                } catch (RemoteException e) {
                    Log.e(TAG, "tick onResult failed: " + e);
                }
            }
            handler.postDelayed(this, 3000);
        }
    };

    @Override
    public void onCreate() {
        super.onCreate();
        Log.d(TAG, "onCreate, start tick");
        handler.postDelayed(tick, 3000);
    }

    @Override
    public void onDestroy() {
        Log.d(TAG, "onDestroy, stop tick");
        handler.removeCallbacks(tick);
        super.onDestroy();
    }

另外,MainActivity增加一个杀进程按钮,能杀掉客户端进程:

运行:

点击杀进程按钮,日志:

服务端 onDestroy, stop tick 说明:客户端进程被杀掉后,AMS 把绑定关系解除了,而RemoteService 只被 bindService 启动,没有 startService 的"启动标记",所以最后一个绑定客户端断开时,系统直接销毁了 Service。

再改下代码,先启动service,再绑定:

再运行,运行个几秒点击杀进程按钮,看下日志:

右日志可见, 服务端没有 onDestroy,tick 继续跑,每次调用回调都抛 DeadObjectException,而 callbacks.size 始终是 1。

服务端手里的 cb 是 ICallbackStubProxy,内部 mRemote 是 BinderProxy,BinderProxy 内部保存的是客户端 callback 的 handle。

客户端进程被 killProcess 杀掉后,Binder 驱动会清理这个进程的所有 Binder 对象。服务端那个 handle 指向的 binder_node 已经不存在了,handle 变成失效句柄。

服务端再调用 cb.onResult(999) 时,BinderProxy.transact 进入驱动,驱动发现 handle 对应的对象已经死了,直接返回错误 DeadObjectException。

handle 还在,但它指向的远端 Binder 已经没了。

callbacks.size一直是1,是因为callbacks是用的普通的arrayList,它不知道binder对象的生命周期。导致死回调永远留在列表里。如果多个客户端反复连接、死亡,列表会无限增长。

相关推荐
消失的旧时光-19431 个月前
Android 系统层扫盲 11:JNI 到底是什么?Java / Kotlin 是怎么调用 C/C++ 的?
android·binder·zygote·system_server·aops
wardenlzr1 个月前
车机Binder 线程池耗尽实战排查与内核内存原理深挖
binder·性能·车机
Android-Flutter2 个月前
android Binder 应用层开发 详解
android·binder
爱跑马的程序员2 个月前
安卓专有的通信子系统-Binder IPC
android·binder·ipc·安卓间通信机制
tzc_fly2 个月前
KDD 2026 | PRIME:一种用于从头设计binder的 3D 分子模型
3d·binder
且随疾风前行.3 个月前
Android Binder 驱动 - 内核驱动层源码初探
android·网络·binder
故渊at4 个月前
第十一板块:Android 跨进程通信与 Binder 深度剖析 | 第二十七篇:Binder 线程池与死亡通知(Death Recipient)机制
android·binder·线程池·死亡通知·跨进程通讯
故渊at4 个月前
第二板块:Android 四大组件标准化学理 | 第十一篇:组件间通信(IPC)与 Binder 深度解析
android·binder·组件化·组件间通信
刮风那天5 个月前
Android AMS创建进程不用Binder而用Socket?
android·java·binder