Análisis de LightsService --- análisis de procesos (elimine el contenido entre paréntesis para reimprimirlo)

2.2 Análisis del proceso de control

2.2.1 Proceso de inicio del servicio LightsService

LightsService se inicia desde SystemServer y todos los servicios del sistema necesarios se iniciarán al ejecutar el método run() de SystemServer.

Esto incluye el servicio de luces utilizado para controlar las luces LED y las luces de fondo de la pantalla, e iniciar el servicio en SystemServer:

private void startBootstrapServices() {
    ...
    // Manages LEDs and display backlight so we need it to bring up the display.
    mSystemServiceManager.startService(LightsService.class);
    ...
}

El constructor de LightsService se ejecutará primero al inicio. El método de construcción es el siguiente:

public LightsService(Context context) {
    super(context);
    mNativePointer = init_native();
    for (int i = 0; i < LightsManager.LIGHT_ID_COUNT; i++) {
        mLights[i] = new LightImpl(i);
    }
}

En el método de construcción, asigne un valor a la variable privada mNativePointer a través del método nativo init_native(), este método es implementado por C++.

La tarea principal es asignar espacio para cada dispositivo Light y devolver el puntero de la primera dirección a mNativePointer. Métodos nativos posteriores para dispositivos Light

Las operaciones se abordan de acuerdo con este puntero. A continuación, se usará un bucle for para crear una instancia de Light y guardarla en una matriz. Este proceso es en realidad el mismo que

En correspondencia con init_native(), la capa superior asigna espacio de almacenamiento para cada objeto Light. De esta forma, se completa el trabajo de inicialización en el método de construcción.

A continuación, se llama a la función de ciclo de vida onStart() del servicio. En el método onStart(), solo se llama a un método privado publishingLocalService,

Puedes ver su prototipo en SystemService:

/**
 * Publish the service so it is only accessible to the system process.
 */
protected final <T> void publishLocalService(Class<T> type, T service) {
    LocalServices.addService(type, service);
}

Este es el objeto de servicio que se pasa al registrar el servicio LightsService, que en realidad es una instancia de LightsManager//

private final LightsManager mService = new LightsManager() {
    @Override
    public Light getLight(int id) {
        if (id < LIGHT_ID_COUNT) {
            return mLights[id];
        } else {
            return null;
        }
    }
};

A través de este método, LightsService se publica en la biblioteca de servicios locales. Se puede ver que LightsService es un servicio local, por lo que no puede ser llamado por aplicaciones externas.

Esto significa que LightsService no pertenece a la API proporcionada por la plataforma (como se muestra en la Figura 1-1) y solo puede ser llamado por otras partes en el mismo paquete en el marco JAVA.

Este método de publicación tiene dos parámetros, el primer parámetro es el tipo, que se utiliza para marcar el tipo de servicio y se utiliza al obtener el servicio. El segundo parámetro se utiliza para guardar la instancia del objeto de servicio.

Dado que es un servicio local, se puede obtener a través de getLocalService(Class<T> tpye).Tome el servicio de administración de notificaciones en el sistema Android para usar LightService como ejemplo:

private Light mNotificationLight;
final LightsManager lights = getLocalService(LightsManager.class);
mNotificationLight=lights.getLight(LightsManager.LIGHT_ID_NOTIFICATIONS);

Este es el proceso de obtención y control de la luz indicadora cuando hay un mensaje de notificación en el sistema Android. El modo proxy (Proxy) en el modo de diseño se usa aquí,

LightsManager actúa como un proxy para el servicio LightsService. En este punto, LightsService se inicia y puede proporcionar servicios.

Si desea acceder al servicio LightsService a través de servicios remotos, debe registrar el servicio de otra manera:

/**
 * Publish the service so it is accessible to other services and apps.
 */
protected final void publishBinderService(String name, IBinder service,
        boolean allowIsolated) {
    ServiceManager.addService(name, service, allowIsolated);
}

Es decir, el objeto de servicio se pasa al ServiceManager a través del mecanismo Binder, y el servicio se puede obtener del ServiceManager a través del nombre, y la interfaz de servicio se proporciona a otras aplicaciones de esta manera.

2.2.2 Obtener y controlar un interruptor de luz y parpadeo

Después de iniciar y ejecutar LightsService, las luces se pueden obtener y operar a través de LightsManager. La instancia de la luz se obtiene por ID al obtener el método. A continuación, analizamos principalmente cómo la capa superior controla el encendido, apagado y parpadeo de las luces.

El control de la luz se completa principalmente en la clase Lingt, incluida la configuración del valor de brillo de la luz, el color de la luz, el parpadeo de la luz, el pulso de la luz y el apagado de la luz. El método se ve así:

public abstract void setBrightness(int brightness);
public abstract void setBrightness(int brightness, int brightnessMode);
public abstract void setColor(int color);
public abstract void setFlashing(int color, int mode, int onMS, int offMS);
public abstract void pulse();
public abstract void pulse(int color, int onMS);
public abstract void turnOff();

En la implementación de estos métodos, se llamará a un método después del procesamiento de parámetros: setLightLocked(int color, int mode, int onMS, intoffMS, int brightMode).

Entre ellos, el método pulse() iniciará una tarea de controlador retrasada para detener el parpadeo de la luz después del tiempo establecido. Cada uno de los métodos anteriores especifica diferentes

parámetros para lograr sus respectivos objetivos. El primer parámetro es el valor de color o se convierte en un valor de color a partir del valor de brillo pasado. El segundo parámetro es el modo de brillo, hay tres valores opcionales aquí,

El significado de estos tres modos se puede ver en la definición de light.h (introducida en el Capítulo 4), LIGHT_FLASH_NONE significa que no parpadea; LIGHT_FLASH_TIMED significa según

El tiempo establecido para parpadear, puede especificar cuánto tiempo está encendido y cuánto tiempo está apagado; LIGHT_FLASH_HARDWARE significa que el parpadeo de la luz debe ser controlado por hardware. tercero y

El cuarto parámetro indica el tiempo de encendido y apagado. El último parámetro es el modo de brillo, hay dos valores opcionales aquí, BRIGHTNESS_MODE_USER y BRIGHTNESS_MODE_SENSOR,

A su vez, el usuario establece el brillo y el sensor de luz establece el brillo.

El método setLightLocked luego llamará al método local setLight_native(mNativePointer, mId, color, mode, onMS, offMS, brightMode),

Entre ellos, el parámetro mNativePointer es el puntero de dirección de inicio de todos los dispositivos de luz en el sistema devuelto después de la inicialización cuando se inicia el servicio LightsService como se describe anteriormente.

Hasta aquí, los parámetros anteriores se pasan a la capa inferior para procesar el equipo de lámparas. Mientras esté familiarizado con las interfaces anteriores, puede controlar las luces en la capa superior.

Supongo que te gusta

Origin blog.csdn.net/xiaowang_lj/article/details/132117364
Recomendado
Clasificación