22 Mecanismo de transmisión de AndroidBroadcast
El mecanismo de transmisión se utiliza para la comunicación entre procesos / subprocesos. La transmisión se divide en dos procesos: envío de transmisión y recepción de transmisión. El receptor de transmisión BroadcastReceiver es uno de los cuatro componentes principales de Android.
BroadcastReceiver se divide en dos categorías:
Los métodos de envío de transmisiones se pueden dividir en tres categorías:
Las transmisiones se graban en el sistema con objetos BroadcastRecord, que tienen Varias variables miembro relacionadas con el tiempo
El registro de transmisión, para el desarrollo de aplicaciones, a menudo llama al método RegisterReceiver () en Actividad / Servicio, y Actividad o Servicio hereda indirectamente de la clase abstracta Contexto. a la izquierda para la clase ContextImpl. Además, llamar a getOuterContext() puede obtener la Actividad o Servicio del llamante más externo.
[ContextImpl.java]
Entre ellos, broadcastPermission tiene el control de permisos de transmisión y el programador se usa para especificar el hilo de ejecución de onRecive cuando se recibe la transmisión. Cuando el programador = nulo. , el valor predeterminado es el hilo principal Ejecución, que también es el uso más común
[ContextImpl.java]
ActivityManagerNative.getDefault() devuelve el objeto ActivityManagerProxy, denominado AMP. .
Este método Entre los parámetros, mMainThread.getApplicationThread() devuelve ApplicationThread, que es el extremo Bn de Binder y se utiliza para la comunicación entre el proceso system_server y el proceso.
[-> LoadedApk.java]
Registremos el ArrayMap con BroadcastReceiver como clave y LoadedApk.ReceiverDispatcher como valor A. Aquí mReceivers es un ArrayMap con Context como clave y A como valor. Para ReceiverDispatcher (distribuidor de transmisiones), cree uno si no existe.
Aquí mActivityThread es el controlador del hilo principal actual pasado anteriormente.
ReceiverDispatcher (distribuidor de transmisión) tiene una clase interna InnerReceiver, que hereda de IIntentReceiver.Stub. Obviamente, este es un servidor Binder, y el distribuidor de transmisión puede obtener el objeto del servidor Binder InnerReceiver a través de rd.getIIntentReceiver (), que se utiliza para la comunicación Binder IPC.
[-> ActivityManagerNative.java]
Hay dos objetos de servidor de Binder, llamador y receptor, y ambos representan el proceso donde se ejecuta la acción de transmisión de registro. AMP utiliza el controlador de Binder para transferir. esta información se envía al objeto AMS en el proceso system_server y luego ingresa a AMS.registerReceiver.
[-> ActivityManagerService.java]
Entre ellos, mRegisteredReceivers registra todas las transmisiones registradas, con el receptor IBinder como clave y ReceiverList como valor como HashMap.
Hay dos colas de transmisión en BroadcastQueue, mParallelBroadcasts y mOrderedBroadcasts. Los tipos de datos son ArrayList
Este método se utiliza para determinar si los datos de intención iniciados coinciden correctamente. Hay 4 elementos coincidentes: acción, tipo, datos y categoría. Si alguno de ellos no coincide correctamente, fallará. .
broadcastQueueForIntent (Intent intent) 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.
Registrar transmisión:
Además, al registrar una transmisión fija:
Una vez completado el registro de la transmisión, hay otra operación en el proceso de envío de la transmisión. >
Para enviar una transmisión, llama al método sendBroadcast() en Actividad o Servicio. La Actividad o Servicio hereda indirectamente de la clase abstracta Contexto y el trabajo real se deja a la clase ContextImpl.
[ContextImpl.java]
[-> ActivityManagerNative.java]
[-> ActivityManagerService.java]
broadcastIntent() El método tiene dos parámetros booleanos serializados y fijos para determinar si se trata de una transmisión normal, una transmisión ordenada o una transmisión fija. Los parámetros son los siguientes:
El método broadcastIntentLocked es relativamente largo y se divide en. 8 partes.
El trabajo más importante de este proceso es:
BroadcastReceiver también tiene otros flags, ubicados en constantes Intent.java:
Funciones principales:
Este proceso está relacionado principalmente con los 10 tipos de transmisiones relacionadas con el sistema, que no se explicarán aquí
Este proceso implica principalmente agregar transmisiones fijas a la lista y colocarlas en mStickyBroadcasts.
Otras instrucciones:
AMS.collectReceiverComponents:
Hay una variable miembro mParallelBroadcasts en la cola de transmisión, de tipo ArrayList
Todos los receptores registrados registrados dinámicamente se fusionan en receptores y luego se procesan de manera unificada en serie.
Hay una variable miembro mOrderedBroadcasts en la cola de transmisión, de tipo ArrayList
Proceso de transmisión de envío:
Método de procesamiento:
Se puede ver que no importa qué método de transmisión se use, se usa broadcastQueueForIntent () para determinar el indicador de intención Para determinar la cola de primer plano o la cola de fondo, y luego llamar al método ScheduleBroadcastsLocked de la cola de transmisión correspondiente para procesar la transmisión.
Durante el proceso de envío de la transmisión, ScheduleBroadcastsLocked; se ejecutará el método para procesar la transmisión relacionada
[ -> BroadcastQueue.java]
Cuando se crea el objeto BroadcastQueue, mHandler=new BroadcastHandler(handler.getLooper()); esto es manejado por handleMessage de mHandler:
By Se puede ver que BroadcastHandler usa el Looper del hilo "ActivityManager"
[-> BroadcastQueue.java]
Aquí mService es AMS. Todo el proceso es bastante largo y AMS se mantiene bloqueado durante todo el proceso, por lo que cuando la eficiencia de transmisión es baja, afectará seriamente el rendimiento y la fluidez del teléfono. la granularidad del bloqueo de sincronización.