参考: 深入理解Binder

 

下面给出一个demo实例 

demo 下载链接

打印信息头文件

cur_log.h

#ifndef CUR_LOG_H#define CUR_LOG_H#include #include #include #include #ifdef __cplusplusextern "C" {#endif#undef  LOG_TAG#define LOG_TAG "binder_test"#define cur_logi(...) __android_log_print(ANDROID_LOG_INFO, LOG_TAG, __VA_ARGS__)  /* 普通打印信息 */#define cur_loge(...) __android_log_print(ANDROID_LOG_ERROR, LOG_TAG, __VA_ARGS__) /* 错误打印信息 */// #define cur_logi(fmt, args...)  printf("I %s " fmt "\n", LOG_TAG, ##args)// #define cur_loge(fmt, args...)  printf("E %s " fmt "\n", LOG_TAG, ##args)#define cur_enter() cur_logi("enter %s", __func__)#define cur_exit()  cur_logi("exit %s", __func__)#ifdef __cplusplus}#endif/* CUR_LOG_H */#endif

 

客户端 服务端 业务接口声明

IMyService.h

#ifndef IMYSERVICE_H#define IMYSERVICE_H#include "cur_log.h"#include #include #include #include #define MY_SERVICE "coder.Myservice"using namespace android;namespace android{// 声明业务接口, Bp Bn 继承 业务接口    class IMyService : public IInterface    {    public:        // 定义命令字段        enum        {            // SEND_INT = 0 , 可自定义            SEND_INT = IBinder::FIRST_CALL_TRANSACTION,            GET_STRING,            GET_INT,            SAY_HELLO,        };        // 使用宏,声明 MyService 业务接口,将业务和通信牢牢地钩在了一起        DECLARE_META_INTERFACE(MyService);        // 声明方法        virtual void sendInt(int32_t val) = 0;        virtual String8 getString() = 0;        virtual int32_t getInt() = 0;        virtual void sayHello() = 0;    };// 声明客户端 BpMyService    class BpMyService : public BpInterface    {    public:        BpMyService(const sp& impl);        ~BpMyService();        virtual void sendInt(int32_t val);        virtual String8 getString();        virtual int32_t getInt();        virtual void sayHello();    };// 声明服务端 BnMyService    class BnMyService : public BnInterface    {    public:        // BnXXService实现了onTransact函数,它将根据消息码调用对应的业务逻辑函数        virtual status_t onTransact(uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags = 0);        BnMyService();        ~BnMyService();        virtual void sendInt(int32_t val);        virtual String8 getString();        virtual int32_t getInt();        virtual void sayHello();    private:        int32_t option;    };}#endif

 

客户端 服务端 实现

IMyService.cpp

#include "IMyService.h"#include #include namespace android{    // 实现 IMPLEMENT_META_INTERFACE 宏模板定义 MyService 业务接口, 将业务和通信牢牢地钩在了一起    IMPLEMENT_META_INTERFACE(MyService, MY_SERVICE);    /***************************************************************************************************     *   客户端    */        BpMyService::BpMyService(const sp& impl) : BpInterface(impl)        {        }        BpMyService::~BpMyService() {};        void BpMyService::sendInt(int32_t val)        {            Parcel data, reply;            data.writeInterfaceToken(IMyService::getInterfaceDescriptor());            data.writeInt32(val);            remote()->transact(SEND_INT, data, &reply);        }        String8 BpMyService::getString()        {            Parcel data, reply;            data.writeInterfaceToken(IMyService::getInterfaceDescriptor());            remote()->transact(GET_STRING, data, &reply);            String8 res = reply.readString8();            return res;        }        int32_t BpMyService::getInt()        {            Parcel data, reply;            data.writeInterfaceToken(IMyService::getInterfaceDescriptor());            remote()->transact(GET_INT, data, &reply);            int32_t val = reply.readInt32();            return val;        }        void BpMyService::sayHello()        {            Parcel data, reply;            data.writeInterfaceToken(IMyService::getInterfaceDescriptor());            remote()->transact(SAY_HELLO, data, &reply);            int32_t val = reply.readInt32();            printf("say hello %d \n", val);        }    /***************************************************************************************************    *  服务端    */    BnMyService::BnMyService()    {        option = 0;    }    BnMyService::~BnMyService()    {}    /* 接收远程消息,处理 onTransact 方法 */    status_t BnMyService::onTransact(uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags)    {        switch(code)        {            case SEND_INT:                {                    CHECK_INTERFACE(IMyService, data, reply);                    int32_t val = data.readInt32();  // 调用服务类的函数                    sendInt(val);                    return NO_ERROR;                }                break;            case GET_STRING:                {                    CHECK_INTERFACE(IMyService, data, reply);                    String8 res = getString(); // 调用服务类的函数                    reply->writeString8(res);                    return NO_ERROR;                }                break;            case GET_INT:                {                    CHECK_INTERFACE(IMyService, data, reply);                    int32_t val = getInt(); // 调用服务类的函数                    reply->writeInt32(val);                    return NO_ERROR;                }                break;            case SAY_HELLO:                {                    CHECK_INTERFACE(IMyService, data, reply);                    sayHello();                    reply->writeInt32(2019);                    return NO_ERROR;                }                break;            default:                return BBinder::onTransact(code, data, reply, flags);        }    }    void BnMyService::sendInt(int32_t val)    {        option = val;    }    int32_t BnMyService::getInt()    {        return option;    }    String8 BnMyService::getString()    {        String8 str;        if(option <= 0)        {            str = String8("val <= 0");        }        else        {            str = String8("val > 0 ");        }        return str;    }    void BnMyService::sayHello()    {        printf("Hello, %s\n", __func__);    }}

 

注册 service 到系统

MyService.cpp

#include "IMyService.h"#include #include int main(int argc __unused, char *argv[] __unused){    sp < IServiceManager > sm = defaultServiceManager(); //获取service manager引用    sm->addService(String16(MY_SERVICE), new BnMyService()); // 注册 MySerivce 服务到系统中    // 开启线程池,接收处理Client发送的进程间通信请求    ProcessState::self()->startThreadPool();  //启动线程池    IPCThreadState::self()->joinThreadPool(); //把主线程加入线程池    return 0;}

客户端测试

MyService.cpp

#include "IMyService.h"#include int main(){    sp < IServiceManager > sm = defaultServiceManager(); //获取service manager引用    sp < IBinder > binder = sm->getService(String16(MY_SERVICE));//获取名为 "coder.Myservice" 的binder接口if(binder == NULL){cur_loge("error, binder = NULL %s", __func__);return -1;}    // 获取 client <--> servicesp service = IMyService::asInterface(binder);if(service == NULL){cur_loge("error, service = NULL %s", __func__);}for(int32_t i = 0; i < 10; i++){service->sendInt(-i);String8 str1 = service->getString();cur_logi("val = %d, str1 : %s", service->getInt(), str1.string());service->sendInt(i);String8 str2 = service->getString();    cur_logi("val = %d, str2 : %s", service->getInt(), str2.string());}    service->sayHello();return 0;}

 

Android.mk

LOCAL_PATH := $(call my-dir)##################### MyService####################include $(CLEAR_VARS)#LOCAL_MODULE_TAGSS := optional#LOCAL_MODULE_CLASS := minrrayLOCAL_SRC_FILES := IMyService.cpp \                     MyServer.cppLOCAL_C_INCLUDES += $(LOCAL_PATH) \$(TOP)/system/core/include/LOCAL_SHARED_LIBRARIES := libc libutils libcutils liblog libbinderLOCAL_MODULE := MyServiceinclude $(BUILD_EXECUTABLE)##################### Myclient####################include $(CLEAR_VARS)LOCAL_SRC_FILES := IMyService.cpp \ MyClient.cppLOCAL_C_INCLUDES += $(LOCAL_PATH) \$(TOP)/system/core/include/LOCAL_SHARED_LIBRARIES := libc libutils libcutils liblog libbinderLOCAL_MODULE := MyClientinclude $(BUILD_EXECUTABLE)

 

测试:

MyService &   # 运行服务MyClient      # 运行测试

Android binder 实例_第1张图片

更多相关文章

  1. Android App怎样调用 Frameworks Bluetooth接口
  2. Android LCD(二):LCD常用接口原理篇
  3. Android中解析xml文件的接口
  4. android 外挂字幕接口
  5. Android中callback(接口回调)机制
  6. Android调用相机接口
  7. android aidl接口初步了解
  8. android访问I2C接口
  9. Android中回调接口使用实例

随机推荐

  1. android 中使用sqLite例子
  2. android中 sqlite sql操作
  3. Android必备软件
  4. Android(安卓)小项目之--解析如何获取SDC
  5. Android API开发之OpenGL开发之Android O
  6. Android环境建立之编译Android内核源码笔
  7. Cordova更改Gradle版本
  8. android kitkat(4.4以上)各个版本的特性解
  9. Android 开机自启动 App
  10. 根据文字的多少,自动适应变化的表格...