22 mecanismo de transmisión
Los receptores de transmisiones se dividen en dos categorías:
Los métodos de propagación de transmisiones se pueden dividir en tres categorías:
Las transmisiones se registran en el sistema como objetos BroadcastRecord. El objeto tiene varias variables miembro relacionadas con el tiempo.
El registro de transmisión se utiliza para el desarrollo de aplicaciones. El método RegisterReceiver() en Actividad/Servicio a menudo se llama. Actividad y Servicio se heredan indirectamente de la clase abstracta Contexto, y el trabajo real se deja a la clase ContextImpl. . Además, llame a getOuterContext() para obtener la actividad o el servicio de la persona que llama más externa.
[ContextImpl.java]
BroadcastPermission tiene control de permisos para la transmisión, y el programador se usa para especificar el hilo de ejecución recursivo al recibir la transmisión. Cuando el planificador = nulo, significa que se ejecuta en el hilo principal de forma predeterminada, que también es el uso más común.
[ContextImpl.java]
Gestión de actividades. getDefault() devuelve un objeto ActivityManagerProxy, abreviado como AMP.
El parámetro en este método es mmainthread. ApplicationThread(), que es el lado Bn de Binder, se utiliza para la comunicación entre el proceso system_server y este proceso.
[-》;LoadedApk.java]
Deje que ArrayMap y LoadedApk usen BroadcastReceiver como clave. ReceiverDispatcher como valor marcado como . Aquí mReceivers es un mapa de matriz con contexto como clave y como valor. Para ReceiverDispatcher, cree uno si no existe.
Aquí mActivityThread es el controlador del hilo principal actual pasado anteriormente.
ReceiverDispatcher tiene una clase interna InnerReceiver, que hereda de IIntentReceiver.Stub. Obviamente, este es un servidor vinculante, y el distribuidor de transmisión puede obtener el objeto del servidor vinculante InnerReceiver a través de rd.getIIntentReceiver () para vincular Definir IPC. comunicación.
[-》;ActivityManagerNative.java]
Hay dos objetos del servidor Binder, el llamador y el receptor, que representan el proceso de realizar operaciones de transmisión de registro. AMP envía esta información al objeto AMS en el proceso system_server a través del controlador Binder y luego a AMS.registerReceiver.
[-》;ActivityManagerService.java]
Entre ellos, mRegisteredReceivers registra todas las transmisiones registradas, el receptor IBinder como clave, la Lista de receptores como valor y HashMap.
En la cola de transmisión, hay dos colas de transmisión, paralelallebroadcasts y ordenóroadcasts, las cuales tienen el tipo de datos ArrayList
El tipo de datos mlruProcesses es ArrayList
Este usos del método Si los datos de intención iniciados mediante la coincidencia coinciden con éxito. Hay cuatro coincidencias: acción, tipo, datos, categoría; cualquier coincidencia fallida fallará.
broadcastqueueforintent determina si se trata de una transmisión en primer plano o en segundo plano al juzgar si intent.getFlags () contiene FLAG_RECEIVER_FOREGROUND y luego devuelve la cola de transmisión correspondiente mFgBroadcastQueue o mBgBroadcastQueue.
Registro para transmisión:
Además, cuando se registra en Sticky Radio:
Después de registrar la transmisión, hay otra operación en proceso de transmisión de transmisión. .
Enviar una transmisión es llamar al método sendBroadcast() en una actividad o servicio. Estos métodos se heredan indirectamente de la clase abstracta Context y el trabajo real se le da a la clase ContextImpl.
[ContextImpl.java]
[-》;ActivityManagerNative.java]
[-》;ActivityManagerService.java]
broadcastIntent () El método tiene dos parámetros booleanos serializados y fijos, que se utilizan para determinar conjuntamente si se trata de una transmisión normal, una transmisión ordenada o una transmisión fija. Estos parámetros son los siguientes:
El método BroadcastIntentLocked es relativamente largo y se divide en ocho partes para explicarlo respectivamente.
El trabajo más importante en este proceso es:
BroadcastReceiver también tiene otros flags, ubicados en las constantes de Intent.java:
Funciones principales:
Esto se encuentra principalmente en las 10 transmisiones relacionadas con el sistema, así que lo explicaré aquí.
Este proceso implica principalmente agregar transmisiones fijas a la lista y colocarlas en mStickyBroadcasts.
Otras notas:
AMS.collectReceiverComponents:
Hay una variable miembro mParallelBroadcasts en la cola de transmisión, de tipo ArrayList
Dynamic registro Los receptores se incorporan al receptor y se procesan en modo serie.
Hay una variable miembro de tipo ArrayList mOrderedBroadcasts en la cola de transmisión
Proceso de envío de transmisión:
Método de procesamiento:
Como puedas Ver, Independientemente del modo de transmisión, use BroadcastQueueForIntent () para determinar si es una cola en primer plano o una cola en segundo plano según el indicador de intención, y luego llame al método ScheduleBroadcastsLocked correspondiente a la cola de transmisión para procesar la transmisión;
En el proceso de envío de la transmisión, se ejecuta ScheduleBroadcastsLocked Método para manejar transmisiones relacionadas.
[-》;BroadcastQueue.java]
Al crear un objeto BroadcastQueue, mhandler = newBroadcastHandler(handler.get looper()); luego el handleMessage de mHandler lo manejará aquí: p>
Puedes ver que BroadcastHandler usa el Looper del hilo "ActivityManager".
[-》;BroadcastQueue.java]
El MS mService aquí es AMS. Todo el proceso es bastante largo y el bloqueo de AMS siempre se mantiene. Por lo tanto, en el caso de una baja eficiencia de transmisión, el rendimiento y la fluidez de este teléfono se verán seriamente afectados. Aquí, deberíamos considerar refinar la granularidad de los bloqueos de sincronización.