Cómo usar adhesivo en Android
(1) Obtener la referencia de objeto de ServiceManager
(2) Registrar un nuevo servicio con ServiceManager
(3) Obtener la referencia del objeto de servicio en el cliente a través de ServiceManager
(3) Enviar la solicitud en el cliente y dejar que el servicio devuelva el resultado. Referencia del objeto de servicio
(3) Envíe una solicitud en el cliente y deje que el servicio devuelva el resultado.
Consulte la implementación del código específico a continuación.
3.1 Implementación del código libmyservice
(1) Cree un nuevo directorio frameworks/base/myservice/libservice e ingrese al directorio
vista simple
$ cd frameworks/base
$ mkdir miservicio
$ cd miservicio
$ mkdir libmyservice
$ cd libmyservice
(2) Escriba el archivo libmyservice/myservic.h
(3) Copie el archivo libmyservice/myservic.h al archivo libmyservice/myservic.h.
h archivo
ver plano
#include lt;utils/threads.hgt;
#include lt;utils/RefBase.hgt;
#include lt;binder/IInterface.hgt;
#include lt;binder/BpBinder.hgt;
#include lt;binder/Parcel.hgt;
espacio de nombres android {
clase MyService: BBinder público
{
Mutex mlock mutable;
int32_t mNextConnId;
público:
static int instanciate();
MiServicio();
virtual ~MiServicio();
virtual status_t onTransact(uint32_t, const Parcelamp;, Parcel*, uint32_t
};
} //espacio de nombres
(2) Escribir libservice/ archivo myservice.cpp
(3) Escribir archivo libservice/myservice.cpp
(4) Escribir archivo libservice/myservice.cpp
(5) Escribir libservice /archivo myservice.cpp
(6) Escriba el archivo libservice/myservice.cpp #include lt;binder/IPCThreadState.hgt;
espacio de nombres android {
estático struct sigaction oldact;
static pthread_key_t sigbuskey;
int MyService::instantiate()
{
LOGE("MyService instanciar"
//defaultServiceManager () obtiene la referencia del objeto de ServiceManager, addService() registra un nuevo servicio con ServiceManager
int r = defaultServiceManager()-gt; "android .myservice"), new MyService());
LOGE("MyService r = d/n", r);
return r;
}
MiServicio::MiServicio()
{
LOGV("MiServicio creado");
mNextConnId = 1;
pthread_key_create(amp; sigbuskey, NULL);
}
MiServicio::~MiServicio
( )
{
pthread_key_delete(sigbuskey);
LOGV("Mi servicio destruido");
}
// Cada servicio del sistema hereda de la clase BBinder y debe anular la función virtual onTransact de BBinder.
Cuando el usuario envía una solicitud al servicio, el marco del sistema llamará a la función onTransact del servicio, que analizará el paquete de datos recibido y llamará a la función de interfaz correspondiente para procesar la solicitud
status_t MyService:: onTransact(código uint32_t, datos const Parcelamp;, respuesta de Parcel*, indicadores uint32_t)
{
switch(código)
{
caso 0: {
pid_t pid = data.readInt32();
int num = data.readInt32()
num = num 100; p>respuesta -gt; writeInt32(num);
return NO_ERROR;
}
interrupción
Predeterminado:
return BBinder::onTransact(código, datos, respuesta, banderas);
}
}
}
} p>
}; //espacio de nombres
(3) Escribir archivo libservice/Android .mk
ver plano
# Archivo: Android .mk
LOCAL_PATH:= $(call my-dir)
Incluye $(CLEAR_VARS)
LOCAL_SRC_FILES:= myservice.cpp
LOCAL_C_INCLUDES: = $(JNI_H_INCLUDE)
LOCAL_SHARED_LIBRARIES := libutils libbinder
LOCAL_MODULE_TAGS := opcional
LOCAL_PRELINK_MODULE := falso
LOCAL_MODULE := libmyservice
incluir $(BUILD_SHARED_LIBRARY)
(4) Compile la biblioteca dinámica libmyservice.so
En el directorio principal de origen de Android
Ver texto puro
$ source build/envsetup.sh
incluido dispositivo/htc/passion/vendorsetup.sh
incluido dispositivo/samsung/crespo4g/vendorsetup .sh
incluido dispositivo/samsung/crespo/vendorsetup.sh
$ mmm frameworks/base/myservice/libmyservice/
Archivo generado después de una compilación exitosa: out /target/product/generic/system/lib/libmyservice.so