原文:http://blog.chinaunix.net/uid-25677340-id-3072236.html
service
- #include
- #include
- #include
- #include
- #include
- using namespace android;
- #ifdef LOG_TAG
- #undef LOG_TAG
- #endif
- #define LOG_TAG "testService"
- class MyService : public BBinder
- {
- public:
- MyService()
- {
- mydescriptor = String16("media.hello");
- n=0;
- }
- virtual ~MyService() {}
- //This function is used when call Parcel::checkInterface(IBinder*)
- virtual const String16& getInterfaceDescriptor() const
- {
- LOGE("this is enter ==========getInterfaceDescriptor");
- return mydescriptor;
- }
- protected:
- void show()
- {
- LOGE("this is for test show!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
- LOGE("this is for test show!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
- LOGE("this is for test show!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
- LOGE("this is for test show!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
- LOGE("this is for test show!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
- }
- virtual status_t onTransact( uint32_t code,
- const Parcel& data,
- Parcel* reply,
- uint32_t flags = 0)
- {
- LOGD("enter MyService onTransact and the code is %d",code);
- /*
- if (data.checkInterface(this))
- LOGD("checkInterface OK");
- else
- {
- LOGW("checkInterface failed");
- return BBinder::onTransact(code, data, reply, flags);
- }
- */
- switch (code)
- {
- case 1:
- LOGD("MyService interface 1");
- break;
- case 2:
- LOGD("MyService interface 2");
- cb = data.readStrongBinder();
- break;
- case 3:
- {
- LOGD("MyService interface 3, exit");
- //No unregister service routine?
- //It should return to client first and then call exit in another place.
- exit(0);
- break;
- }
- case 4:
- {//call cb
- LOGD("MyService interface 4 before if================");
- cb = data.readStrongBinder();
- if (cb != NULL)
- {
- LOGD("MyService interface 4");
- Parcel in, out;
- in.writeInterfaceToken(String16("ghq.callback"));
- in.writeInt32(n++);
- in.writeString16(String16("This is a string."));
- cb->transact(1, in, &out, 0);
- show();
- }
- break;
- }
- default:
- return BBinder::onTransact(code, data, reply, flags);
- }
- return 0;
- }
- private:
- String16 mydescriptor;
- sp cb;
- int n;
- };
- int main()
- {
- sp sm = defaultServiceManager();
- status_t ret;
- //register MyService to ServiceManager
- MyService* srv = new MyService();
- ret = sm->addService(String16("media.hello"), srv);
- LOGD("addservice media.hello return %d", ret);
- //call binder thread pool to start
- ProcessState::self()->startThreadPool();
- IPCThreadState::self()->joinThreadPool(true);
- return 0;
- }
client
- #include
- #include
- #include
- #include
- #include
- #include
- using namespace android;
- #ifdef LOG_TAG
- #undef LOG_TAG
- #endif
- #define LOG_TAG "testCallback"
- class MySetupCallback : public BBinder
- {
- public:
- MySetupCallback()
- {
- mydescriptor = String16("android.os.ISetupCallback");
- }
- virtual ~MySetupCallback() {}
- virtual const String16& getInterfaceDescriptor() const
- {
- return mydescriptor;
- }
- protected:
- virtual status_t onTransact( uint32_t code,
- const Parcel& data,
- Parcel* reply,
- uint32_t flags = 0)
- {
- LOGD("enter MySetupCallback onTransact, code=%u", code);
- if (data.checkInterface(this))
- LOGD("checkInterface OK");
- else
- {
- LOGW("checkInterface failed");
- return -1;
- }
- switch (code)
- {
- default:
- break;
- }
- return 0;
- }
- private:
- String16 mydescriptor;
- };
- int main()
- {
- sp sm = defaultServiceManager();
- sp b = sm->getService(String16("media.hello")); //Context.MCU_SERVICE
- if (b == NULL)
- {
- LOGW("Can't find binder service \"media.hello\"");
- return -1;
- }
- Parcel in1,out1;
- MySetupCallback *cb = new MySetupCallback();
- in1.writeStrongBinder(sp(cb));
- int ret = b->transact(4, in1, &out1, 0); //TRANSACTION_registerSetup = 4
- LOGD("transact(4) return %d", ret);
- ProcessState::self()->startThreadPool();
- IPCThreadState::self()->joinThreadPool();
- return 0;
- }
Android.mk
- # Copyright 2006 The Android Open Source Project
- LOCAL_PATH:= $(call my-dir)
- include $(CLEAR_VARS)
- LOCAL_MODULE_TAGS := eng
- LOCAL_SRC_FILES:= \
- testCallback.cpp
- LOCAL_C_INCLUDES += \
- $(LOCAL_PATH) \
- $(LOCAL_PATH)/../include \
- $(LOCAL_PATH)/../include/callback \
- LOCAL_SHARED_LIBRARIES := \
- libcutils \
- libbinder \
- libutils \
- libhardware
- LOCAL_CFLAGS := -DRIL_SHLIB
- LOCAL_MODULE:= testCallback
- include $(BUILD_EXECUTABLE)
- include $(CLEAR_VARS)
- LOCAL_MODULE_TAGS := eng
- LOCAL_SRC_FILES:= \
- testService.cpp
- LOCAL_C_INCLUDES += \
- $(LOCAL_PATH) \
- $(LOCAL_PATH)/../include \
- $(LOCAL_PATH)/../include/callback \
- LOCAL_SHARED_LIBRARIES := \
- libcutils \
- libbinder \
- libutils \
- libhardware
- LOCAL_CFLAGS := -DRIL_SHLIB
- LOCAL_MODULE:= testService
- include $(BUILD_EXECUTABLE)
本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请
点击举报。