La Red de Conocimientos Pedagógicos - Conocimientos universitarios - 02 Arquitectura del Proyecto-Marco de Comunicación IPC

02 Arquitectura del Proyecto-Marco de Comunicación IPC

La IPC (comunicación entre procesos) en el desarrollo de aplicaciones para Android está en todas partes. Por ejemplo, AlarmManager y InputMethodService que utilizamos son servicios proporcionados por el sistema y están en procesos separados. Si necesita utilizar estos servicios en su propio proceso de aplicación, debe realizar la comunicación IPC.

Además, también existe la posibilidad de comunicación de procesos en nuestros propios programas (especialmente en algunas aplicaciones grandes)

PQ: No iniciado sesión

WeChat: Después de usarlo por un período de tiempo:

Escenario: habilitar el servicio de posicionamiento en el Servicio está en un proceso separado y necesita obtener resultados de posicionamiento en el proceso principal de la Aplicación u otras Aplicaciones.

El servicio proporciona métodos expuestos a otros procesos y proporciona una marca de anotación ServiceId, y la implementación del servicio debe recibir el mismo ServiceId y la misma implementación del método. No es obligatorio que LocationManager herede la interfaz ILocationManager j, pero. Para garantizar firmas de métodos uniformes, se recomienda la herencia. (De lo contrario, uno es getLocation y el otro es getLocation2, lo cual no sería divertido)

Realice el posicionamiento en Servicio y los resultados del posicionamiento se registrarán en LocationManager. Utilice el marco para registrar LocationManager en este Servicio.

No es necesario devolver un objeto Binder, lo que significa que los usuarios no necesitan escribir archivos AIDL engorrosos sin ningún aviso.

El marco proporcionará com.enjoy.ipc.IPCService$IPCServiceX múltiples servicios reservados para comunicarse con otros procesos. Si hay varios procesos en una aplicación y necesitan proporcionar servicios de sus propios procesos, usted puede hacerlo. utilizar diferentes servicios. Entonces, en esencia, todavía depende de la comunicación Service+Binder, pero el marco encapsula y oculta los detalles, lo que facilita su uso.

Después de obtener el objeto de resultado, puede llamar al método remoto (llamada RPC) como si llamara al método local.

Uso simplificado:

1. No es necesario que usted mismo defina la interfaz AIDL y el JavaBean utilizado no requiere implementar la interfaz Parcelable

<; p> 2. En el cliente El cliente no necesita usar bindService directamente para obtener el objeto Binder

El servidor necesita definir la interfaz (ILocationManager) que expone el servicio si el cliente es otra aplicación. , necesita colocar la clase de interfaz en su propio código fuente (no se requiere implementación de interfaz). Los métodos definidos en la interfaz son los métodos proporcionados por el servidor a otros procesos.

El marco completo incluye interfaces de servidor y de cliente.

En el proceso de servicio, el ServiceId y el objeto de clase de implementación del servicio correspondiente se almacenarán en caché: tabla de servicios. Al mismo tiempo, también es necesario registrar todas las listas de métodos en la implementación del servicio: tabla de métodos. Dado que puede haber varios métodos en un servicio, su estructura de datos es Map>. La clave del mapa externo es la clase de servicio y la clave del mapa interno es la etiqueta del método.

Cuando el cliente necesita llamar al servicio, pasa el ServiceId, el MethodName y los parámetros necesarios para ejecutar el método al servidor. El servidor busca la tabla y utiliza la reflexión Method#invoke para ejecutar el método. en el servicio.

La solicitud del cliente se encapsula como un objeto Solicitud y la respuesta del servidor se encapsula como un objeto Respuesta

El servidor solo necesita exponer la interfaz de servicio para que la utilicen otros procesos. por lo que el servidor solo necesita llamar a la interfaz de registro del marco para registrar las implementaciones de servicios. (Lo que se registra es la implementación del servicio, no la interfaz del servicio)

Al registrarse, obtenga el ServiceId en la Clase mediante reflexión para registrar la tabla de servicios. Al mismo tiempo, utilice la reflexión para obtener todos los métodos públicos en la Clase para registrar la tabla de métodos.

Dado que la esencia del marco todavía utiliza Binder para completar la comunicación, para comunicarse con otros procesos, el marco proporciona múltiples servicios reservados.

El servicio de comunicación devolverá un objeto de clase Binder generado por AIDL.

El cliente utiliza el método de envío para iniciar una solicitud al servidor.

Implementación después de que el servidor recibe la solicitud:

El cliente primero necesita establecer una conexión con el servidor, por lo que el método de conexión se proporciona en el marco y bindService se encapsula internamente. para implementar la comunicación del servicio con el servidor (IPCService).

Lo único que necesita atención es:

Una vez completado el enlace, el cliente puede obtener el objeto IIPCService proporcionado por el servicio de comunicación del servidor y el cliente llama a IIPCService#send para iniciar una solicitud.

Cuando necesitamos obtener Ubicación. Luego se debe llamar a LocationManager.getDefault().getLocation(). Esta llamada requerirá la ejecución de dos métodos de LocationManager: getDefault y getLocation.

Sin embargo, este objeto existe en el lado del servidor. ¿Cómo lo obtiene el cliente?

Podemos utilizar un proxy dinámico para crear un objeto de interfaz de servicio (proxy) "falso" en el lado del cliente.

Cuando ejecutamos el método (getLocation) de este objeto proxy, se volverá a llamar al método IPCInvocationHandler#invoke. En este método, el marco iniciará una solicitud al servidor: IIPCService#send

Y getLocation devolverá un objeto Ubicación que registra información de ubicación. Este objeto será serializado y enviado por el servidor en json. Por lo tanto, el cliente solo necesita obtener el tipo de retorno del Método aquí y deserializarlo.

RPC se refiere a llamar a una función en el servidor desde el cliente pasando parámetros y obteniendo el resultado devuelto, ocultando los detalles de comunicación subyacentes. En la forma de uso, llama a la función remota al igual que llama a la función local.

Por ejemplo, usamos Okhttp para realizar solicitudes de red:

Este método obviamente no es RPC.

Usando Retrofit:

RPC: Llamamos al método XXX remoto tal como llamamos al método local.