Métodos de comunicación entre procesos y entre subprocesos de Android
Proceso: Es una actividad en ejecución de un programa con ciertas funciones independientes en un determinado conjunto de datos. Un proceso es una unidad independiente para la asignación y programación de recursos en el sistema.
Subproceso: Es una entidad del proceso y la unidad básica de programación y despacho de la CPU. Es una unidad básica que es más pequeña que el proceso y puede ejecutarse de forma independiente. El hilo en sí básicamente no posee recursos del sistema, solo algunos recursos que son esenciales para la operación (como un contador de programa, un conjunto de registros y una pila), pero puede compartir lo que tiene el proceso con otros hilos que pertenecen al mismo. proceso.
Diferencia:
(1) Un programa tiene al menos un proceso y un proceso tiene al menos un hilo
(2) La escala de división de; Los subprocesos son más pequeños que los procesos, lo que hace que los programas de subprocesos múltiples sean altamente concurrentes;
(3) El proceso tiene una unidad de memoria independiente durante la ejecución, mientras que varios subprocesos comparten memoria, pero no hay una unidad de memoria separada entre subprocesos. Espacio de direcciones, si un hilo muere, significa que todo el proceso muere.
---------------------
1. Método de comunicación entre procesos de Android
1.Bundle
Dado que la Actividad, el Servicio y el Receptor pueden transportar el Paquete para transmitir datos a través de Intent, podemos enviar el Paquete que transporta datos al componente de otro proceso a través de Intent en un proceso.
Desventajas: los tipos de datos no admitidos por el paquete no se pueden transmitir.
2.ContentProvider
ContentProvider es uno de los cuatro componentes principales de Android. Almacena datos en una tabla y los proporciona al mundo exterior. en otras aplicaciones a través de datos de procesos. El uso es heredar ContentProvider e implementar los métodos onCreate, consultar, actualizar, insertar, eliminar y getType. onCreate es responsable de realizar algunos trabajos de inicialización durante la creación. El método para agregar, eliminar, verificar y modificar es consultar y modificar los datos. getType devuelve una cadena que indica el tipo de solicitud de Uri. Después del registro, puede utilizar ContentResolver para solicitar el Uri especificado.
3. Archivo
Dos procesos pueden intercambiar datos en el mismo archivo. No solo podemos guardar archivos de texto, sino también conservar objetos en archivos y restaurarlos desde otro archivo. Cabe señalar que pueden ocurrir problemas de concurrencia al leer/escribir al mismo tiempo.
4.Transmisión
La transmisión puede enviar transmisiones a todas las aplicaciones del sistema Android, y las aplicaciones que requieren comunicación entre procesos pueden escuchar estas transmisiones.
5.Método AIDL
El servicio es similar al Proveedor de contenido y también puede acceder a datos en otras aplicaciones. El Proveedor de contenido devuelve objetos Cursor, mientras que el Servicio devuelve objetos Java. puede comunicarse entre procesos se llama servicio AIDL.
?AIDL define la interfaz expuesta por el servidor para ser llamada por el cliente. AIDL permite que el servidor procese en paralelo, mientras que Messenger solo puede ejecutarse en serie después de encapsular AIDL, por lo que Messenger se usa generalmente como un mensaje. transferir.
6. Messenger
Messenger se implementa en base a AIDL. El servidor (lado pasivo) proporciona un servicio para manejar la conexión del cliente (lado activo) y mantiene un controlador para crear Messenger. Devuelve la carpeta de Messenger durante onBind.
Ambas partes utilizan Messenger para enviar datos y Handler para procesar datos. Messenger depende de Handler para procesar datos, por lo que es en serie, es decir, cuando Handler recibe varios mensajes, debe ponerse en cola y procesarse en secuencia.
7. Socket
El método Socket consiste en intercambiar datos a través de la red. Tenga en cuenta que la solicitud debe realizarse en un subproceso; de lo contrario, el hilo principal se bloqueará. Una vez que el cliente y el servidor establecen una conexión, pueden transmitir datos continuamente, lo que es más adecuado para la transmisión de datos en tiempo real
2. Método de comunicación entre subprocesos de Android
En términos generales, La comunicación entre subprocesos se refiere principalmente al host. Hay dos formas principales de comunicación entre subprocesos (también llamados subprocesos de UI) y subprocesos:
1. Mecanismo AsyncTask
AsyncTask, un tarea asincrónica, es decir, en el hilo de la interfaz de usuario Cuando se ejecuta, puede realizar algunas operaciones asincrónicas en segundo plano; AsyncTask puede usar el hilo de la interfaz de usuario de manera fácil y correcta. AsyncTask permite operaciones en segundo plano y envía los resultados a la interfaz de usuario sin usarlo explícitamente. el hilo de trabajo o el mecanismo del controlador. Sin embargo, AsyncTask solo se puede usar para operaciones a corto plazo (operaciones que deberían finalizar en unos pocos segundos como máximo. Si necesita ejecutarse en segundo plano durante mucho tiempo, AsyncTask no es adecuado y solo se puede implementar usando otras API). proporcionado por Java.
2. Mecanismo del controlador
El controlador, heredado de la clase Objeto, se utiliza para enviar y procesar objetos de Mensaje u objetos Ejecutables cuando se crea el Controlador, estará relacionado con el; Objeto Looper del hilo actual (si el Looper del hilo actual está vacío o no existe, se generará una excepción. En este momento, es necesario llamar activamente a Looper.prepare () en el hilo para crear un objeto Looper. ). La función principal de usar Handler es enviar y procesar objetos Message en el proceso posterior y permitir que otros subprocesos completen una determinada acción (como enviar un objeto Message a través del objeto Handler en el subproceso de trabajo, permitir que el subproceso de la interfaz de usuario actualice la interfaz de usuario y luego, el hilo de la interfaz de usuario obtendrá el objeto Message en MessageQueue (la eliminación del objeto Message se completa con su objeto Looper asociado) y responderá en consecuencia).
3. Comunicación entre dos subprocesos de Android
Durante el proceso de entrevista, algunos entrevistadores pueden preguntar sobre el método de comunicación entre los subprocesos de Android, porque la mayoría de los programadores se centran principalmente en la comunicación entre el hilo principal de Android y los subprocesos, por lo que este problema puede confundir fácilmente a la gente.
La comunicación entre el hilo principal y el hilo secundario puede utilizar el controlador en el hilo principal para enviar el mensaje en el hilo secundario al looper en el hilo principal, o al controlador en el hilo principal. envía un mensaje al looper a través de la publicación ejecutable. Pero el looper existe en el hilo principal de forma predeterminada y no hay ningún Looper en el hilo secundario. ¿Qué debemos hacer? De hecho, el principio es muy simple: vincule el looper al subproceso secundario y cree un controlador. Al enviar un mensaje a través de este controlador en otro hilo, se puede lograr la comunicación entre subprocesos.
Dos formas para que los subprocesos creen controladores:
Método 1: crear objetos Looper para subprocesos:
new Thread(new Runnable() {
p>public void run() {?
Looper.prepare();? // Crea un objeto Looper para este hilo. Solo hay un objeto Looper para un Thead<. /p>
Handler handler = new Handler(){?
@Override?
public void handleMessage(Mensaje msg) {?
Toast. makeText(getApplicationContext(), "handleMessage ", Toast.LENGTH_LONG).show();?
}?
};?
handler.sendEmptyMessage( 1);?
Looper.loop(); // Recorre continuamente si hay mensajes en MessageQueue
};?
}).start( );
- --------------------
Método 2: Obtener el looper del hilo principal, o el looper del hilo de la interfaz de usuario:
new Thread(new Runnable() {
public void run() {?
Handler handler = new Handler(Looper. getMainLooper()){ // ¡¡Aquí está la diferencia!! ?
@Override?
public void handleMessage(Message msg) {?
Toast.makeText (getApplicationContext(), "handleMessage", Toast.LENGTH_LONG ).show();?
}?
};?
handler.sendEmptyMessage(1 );?
}; ?
}).start();
---------------- --------