binder 死亡通知demo




/
/


class MyBinderService : public BnInterface<IMyBinderService>
{
public:
    // ...(保留原有代码)

    // 注册客户端死亡通知回调
    void RegisterClientDeathRecipient(const sp<IBinder::DeathRecipient>& recipient);

private:
    sp<IBinder::DeathRecipient> m_clientDeathRecipient;
};

void MyBinderService::RegisterClientDeathRecipient(const sp<IBinder::DeathRecipient>& recipient)
{
    if (recipient != nullptr) {
        m_clientDeathRecipient = recipient;
        // 从客户端获取Binder对象并注册死亡通知
        sp<IBinder> clientBinder = data.readStrongBinder();
        clientBinder->linkToDeath(m_clientDeathRecipient);
    }
}



status_t MyBinderService::OnTransact(uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags)
{
    switch (code) {
        // ...(保留原有代码)

        case REGISTER_CLIENT_DEATH_RECIPIENT: {
            // 解析Parcel中的死亡通知接收者引用
            sp<IBinder::DeathRecipient> recipient = data.readStrongBinder().asBinder()->queryLocalInterface(DEATH_RECIPIENT_INTERFACE_DESCRIPTOR).cast<IBinder::DeathRecipient>();
            if (recipient != nullptr) {
                RegisterClientDeathRecipient(recipient);
                reply->writeInt32(RESULT_OK);
            } else {
                reply->writeInt32(RESULT_ERROR);
            }
            return NO_ERROR;
        }
        // ...
    }
    return SuperType::OnTransact(code, data, reply, flags);
}



/
/


class MyClientDeathRecipient : public IBinder::DeathRecipient
{
public:
    explicit MyClientDeathRecipient(std::function<void()> onClientDiedCallback) : m_onClientDied(onClientDiedCallback) {}

    void binderDied(const wp<IBinder>& who) override
    {
        ALOGE("Binder client with object %p has died.", who.unsafe_get());
        if (m_onClientDied) {
            m_onClientDied();
        }
    }

private:
    std::function<void()> m_onClientDied;
};



sp<MyClientDeathRecipient> clientDeathRecipient = new MyClientDeathRecipient([] {
    // 在这里执行客户端死亡后的清理逻辑
});

// 获取服务端Binder对象
sp<IBinder> binder = getService("com.example.MyBinderService");

// 将客户端死亡接收者封装成Binder对象
sp<IBinder> clientDeathRecipientBinder = new BBinder();
clientDeathRecipientBinder->setInterface(static_cast<IInterface*>(clientDeathRecipient.get()));

// 向服务端发送注册请求
Parcel data, reply;
data.writeInterfaceToken(IMyBinderService::getInterfaceDescriptor());
data.writeStrongBinder(clientDeathRecipientBinder);
status_t status = binder->transact(REGISTER_CLIENT_DEATH_RECIPIENT, data, &reply, FLAG_ONEWAY);

if (status == NO_ERROR && reply.readInt32() == RESULT_OK) {
    ALOGI("Client death recipient registered successfully.");
} else {
    ALOGE("Failed to register client death recipient.");
}

 

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
这是一个简单的binder示例demo,包含一个服务端和一个客户端: 服务端代码(ServiceDemo.cpp): ``` #include <binder/IServiceManager.h> #include <binder/IPCThreadState.h> #include <binder/ProcessState.h> #include <binder/IMemory.h> #include "ServiceDemo.h" using namespace android; int main(int argc, char **argv) { sp<ProcessState> proc(ProcessState::self()); sp<IServiceManager> sm = defaultServiceManager(); sm->addService(String16("demo.service"), new ServiceDemo()); ProcessState::self()->startThreadPool(); IPCThreadState::self()->joinThreadPool(); return 0; } ServiceDemo::ServiceDemo() { ALOGD("ServiceDemo"); } ServiceDemo::~ServiceDemo() { ALOGD("~ServiceDemo"); } int32_t ServiceDemo::add(int32_t a, int32_t b) { ALOGD("add: %d + %d = %d", a, b, a + b); return a + b; } ``` 客户端代码(ClientDemo.cpp): ``` #include <binder/IServiceManager.h> #include <binder/IPCThreadState.h> #include <binder/ProcessState.h> #include <binder/IMemory.h> #include "ServiceDemo.h" using namespace android; int main(int argc, char **argv) { sp<ProcessState> proc(ProcessState::self()); sp<IServiceManager> sm = defaultServiceManager(); sp<IBinder> binder = sm->getService(String16("demo.service")); sp<ServiceDemo> serviceDemo = interface_cast<ServiceDemo>(binder); ALOGD("add result: %d", serviceDemo->add(1, 2)); return 0; } ``` 需要注意的是,在服务端代码中,需要实现aidl文件中定义的接口方法。在本例中,接口方法只有一个add(),返回两个int类型数据的和。 在客户端代码中,首先通过defaultServiceManager()获取IServiceManager对象,然后通过getService()获取服务端的IBinder对象,最后将IBinder对象转换为服务端接口ServiceDemo对象,并调用其中的方法。 本例中,将服务名设为"demo.service",可以根据实际需求修改。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值