Descifrando el mecanismo IPC de Android

Cuando usamos teléfonos Android, a veces el software que utilizamos consume una cantidad relativamente grande de memoria y, a menudo, necesitamos abrir varios programas al mismo tiempo. En estos momentos, necesitaremos utilizar tecnología multiproceso. Como desarrolladores de Android, creo que todos sabemos cómo iniciar un único proceso múltiple de una aplicación, pero después de iniciar múltiples procesos, ¿cómo realizar la "Comunicación entre procesos (IPC)"? Existen muchos métodos de comunicación de procesos y son adecuados para diferentes escenarios de uso. Aprendamos sobre ellos uno por uno a continuación.

conocimientos previos

  • Android cuatro componentes principales
  • Serialización de Java

Introducción a la PCI

Creo que los estudiantes que han tomado el curso de "sistemas operativos" en la universidad todavía recuerdan 进程间通信 信号量机制estos términos, hoy también estamos estudiando la comunicación de los sistemas operativos, pero es para el sistema operativo Android con Linux como núcleo. Generalmente utilizamos un software o programa como proceso. Android puede utilizar multiproceso, e incluso un software un poco más grande utilizará multiproceso. Los propósitos de utilizar múltiples procesos son los siguientes:

  1. Aislamiento de procesos para satisfacer ciertas necesidades comerciales especiales.
  2. Amplíe el tamaño de la memoria del software.

Iniciar el multiproceso es muy simple: la única forma es agregar atributos a AndroidManifest.xmllos cuatro componentes principales en el archivo de registro.android:process

<activity
 android:name="com.qxy.potatos.module.mine.activity.WebViewActivity"
 android:configChanges="orientation|screenSize|keyboardHidden"
 android:exported="false"
 android:process=":h5"
 android:screenOrientation="portrait"
 android:theme="@style/BlackTheme" />

Lo anterior android:process=":h5"se refiere al proceso privado bajo el programa, que es com.qxy.potatos:h5la abreviatura de. Si el valor del atributo se cambia a forma global com.qxy.potatos.h5, significa que el proceso es global y se puede compartir con otras aplicaciones.

La aparición de múltiples procesos conducirá a los siguientes problemas:

  1. Los miembros estáticos y los patrones singleton son completamente inválidos
  2. El mecanismo de sincronización de subprocesos falla por completo.
  3. Disminución de la confiabilidad de SharePreferences
  4. Aplicación creada varias veces

¿Por qué ocurren los problemas anteriores?

Dado que Android asigna una máquina virtual a cada proceso independiente, el espacio de memoria de la máquina virtual debe ser diferente, por lo que diferentes cantidades tienen una copia en diferentes memorias, y solo las copias en la memoria se pueden modificar en diferentes procesos. Por lo tanto, no importa qué tipo de bloqueo se agregue en 1 y 2, no será válido si no se aplica al mismo espacio de memoria.

Y 3 es porque SharePreferences se almacena en un archivo xml. La lectura y escritura simultáneas del archivo por diferentes procesos provocará errores de datos.

En 4, debido a que el mecanismo de inicio de Android es iniciar una nueva Aplicación cada vez, cada proceso tendrá su propia Aplicación. También debemos prestar atención a este problema y clasificar el inicio en Aplicación para evitar que se carguen recursos innecesarios varias veces durante la fase de inicio del multiproceso.

Según las razones y problemas anteriores, debemos tener una comprensión profunda del mecanismo IPC para que la comunicación entre procesos pueda servirnos mejor y resolver los problemas causados ​​por múltiples procesos.

Conceptos básicos de PCI

Serialización y deserialización

Descripción general

Antes de hablar de serialización y deserialización, primero debemos comprender qué son y qué hacen.

Serialización significa el proceso de convertir objetos en secuencias de bytes.

La deserialización es el proceso de restaurar una secuencia de bytes en un objeto.

Entonces, ¿de qué sirve serializar un objeto en una secuencia de bytes?

Serializar el objeto en una secuencia de bytes puede garantizar la integridad y la capacidad de entrega del objeto al transferirlo y guardarlo . Facilite el almacenamiento local o el transporte en el ciberespacio.

La deserialización puede reconstruir el objeto guardado en el flujo de bytes en un objeto

Por tanto, su función principal es guardar y reconstruir el estado del objeto.

Ventajas de la serialización
  1. El objeto serializado es un flujo de bytes y se almacena en el disco duro para facilitar las llamadas de reinicio de JVM.
  2. La secuencia binaria serializada puede reducir el espacio de almacenamiento y facilitar el almacenamiento permanente de objetos.
  3. Los objetos serializados en flujos de bytes binarios facilitan la transmisión de red
  4. Los objetos serializados se pueden utilizar para la comunicación entre procesos.
Métodos de serialización en Android.

Según la discusión anterior, sabemos qué es la serialización y las funciones y ventajas de la serialización. Una de las características principales de la serialización mencionada aquí es que se utiliza para la comunicación entre procesos . Entre los métodos de comunicación entre procesos mencionados más adelante, su punto común es que los objetos se serializan al transmitir información y los objetos se serializan al recibir información. Deserializar.

Hay dos métodos de serialización que deben aprenderse y usarse en Android, a saber, SerializableyParcelable

  • Serializable

    SerializableEs la interfaz de serialización propia de Java, nuestros usuarios solo necesitan heredar Serializablela interfaz para serializar el objeto. La API proporcionada por Java también se utiliza para llamar específicamente a los procesos de serialización y deserialización. ObjectOutputStreamPuede realizar la serialización de objetos y ObjectInputStreamla deserialización de objetos.

    //序列化
    User user = new User(1, "hello world", false); 
    ObjectOutputStream objectOutputStream = new ObjectOutputStream(
     new FileOutputStream("cache.txt"));
    objectOutputStream.writeObject(user);
    objectOutputStream.close();
    ​
    //反序列化
    ObjectInputStream objectInputStream = new ObjectInputStream(
     new FileInputStream("cache.txt"));
    User user = (User) objectInputStream.readObject();//会在此处进行检查,是否同一 serialVersionUID
    objectInputStream.close();
    

    Cabe señalar que Usergeneralmente es necesario especificar la clase serialVersionUIDserializada. Su función es identificar de forma única la clase. Durante la deserialización se comparará el serialVersionUID. Si son inconsistentes, se considerará que las versiones son diferentes y se generará un error. ser reportado.

    Sin embargo, la serialización y deserialización se pueden implementar normalmente si no se especifica el ID, porque el sistema generará automáticamente el valor hash de esta clase y lo asignará a serialVersionUID. Entonces, ¿por qué seguimos recomendando la copia manual? Debido a que el valor hash cambia según el cambio de clase, si la ID es un valor hash, si cambiamos la estructura del objeto después de serializar el objeto , generará ID inconsistentes antes y después, lo que hará que el objeto no pueda ser deserializado. Sin embargo, la ID especificada manualmente permite que el objeto modificado aún se deserialice y su contenido se pueda restaurar al máximo .

     public class User implements Serializable {
         
          
          
     private static final long serialVersionUID = 519067123721295773L;//静态成员不参与序列化过程,代表类的状态public int userId;
     public String userName;
     public boolean isMale;
     
     

Supongo que te gusta

Origin blog.csdn.net/m0_70748458/article/details/130684176
Recomendado
Clasificación