24 Mecanismo AlarmManagerService
El mecanismo JobScheduler del artículo anterior introdujo que las tareas activadas según ciertas condiciones pueden usar JobScheduler. Luego, para tareas que solo están programadas, sin considerar condiciones como la red/tiempo, AlarmManager también se puede usar para completar. .
Uso de AlarmManager
Para alarmManager, según el tipo de alarma y cuando se acabe el tiempo, puede elegir enviar una transmisión, iniciar una Actividad o iniciar un servicio, y otras combinaciones gratuitas.
[-gt; SystemServer.java]
AlarmManagerService se inicializa antes que JobScheduler.
[-gt; AlarmManagerService.java]
Aquí AlarmHandler mHandler = new AlarmHandler(), este controlador se ejecuta en el hilo principal de system_server.
[-gt; AlarmManagerService.java::Constants]
Cuando el sistema está en estado inactivo, el intervalo de tiempo mínimo de alarma es de 9 minutos cuando está en estado no inactivo; el intervalo de tiempo mínimo es 5 s
[-gt; AlarmManagerService.java]
Funciones principales de este método:
[-gt;
Abra el nodo /dev/alarm y cree un objeto de controlador de alarma.
La matriz android_alarm_to_clockid aquí es la siguiente:
Cree AlarmImplTimerFd aquí
[-gt; AlarmManagerService.java::ClockReceiver]
Registrarse Se utiliza para escuchar las transmisiones de TIME_TICK y DATE_CHANGED.
[-gt; AlarmManagerService.java::ClockReceiver]
[-gt; AlarmManagerService.java]
Echemos un vistazo al proceso de trabajo del Hilo "AlarmManager".
[-gt; AlarmManagerService.java::AlarmThread]
[-gt; com_android_server_AlarmManagerService.cpp]
El proceso de uso de la alarma use PendingIntent, primero presentemos brevemente PendingIntent.
Varios métodos estáticos comunes de PendingIntent son los siguientes:
Los tres métodos anteriores eventualmente llamarán a AMS.getIntentSender. primer parámetro. TYPE .
[-gt; PendingIntent.java]
getIntentSender() obtiene el objeto PendingIntentRecord, que hereda de IIntentSender.Stub y se devuelve mediante una llamada de carpeta, así que aquí target se refiere al agente del objeto PendingIntentRecord, que es PendingIntent.mTarget.
Aquí packageName es el nombre del paquete del proceso donde se establece PendingIntent. Esta información se guardará en PendingIntentRecord.Key.
De esto podemos ver que getSystemService(Service.ALARM_SERVICE) obtiene el objeto AlarmManager. Echemos un vistazo a su proceso de creación.
[-gt; AlarmManager.java]
Aquí, mMainThreadHandler es el hilo principal que se ejecuta en el proceso de la aplicación.
[-gt; AlarmManager.java]
[-gt; AlarmManager.java]
Nota: El targetHandler aquí solo está disponible en la lógica de Android N. Aquí mService se refiere a la clase de proxy del IAlarmManager remoto, y la clase de servicio se encuentra en la variable miembro mService = new IAlarmManager.Stub() de ALMS. Se puede ver que el programa luego se ejecuta en el proceso system_server.
De la [] Sección 2.8] sabemos que cuando se activa la hora de la alarma, se ejecuta deliveryAlarmsLocked() A continuación, comencemos con este método.
[-gt; java]
[-gt; AlarmManagerService.java]
[-gt; PendingIntent.java]
De la sección 3.1, sabemos que mTarget representa el control remoto Objeto PendingIntentRecord Se puede ver que el siguiente método para ingresar a system_server es el siguiente:
[-gt; pendienteIntentRecord.java]
[-gt; p>
Visible,
Volver a la Sección 4.2 entregarLocked Se puede ver que cuando no se especifica PendingIntent, se volverá a llamar al proceso doAlarm () del oyente. El objeto ListenerWrapper creado por [. Sección 3.4].
[-gt ; AlarmManager.java::ListenerWrapper]
De forma predeterminada, mHandler se refiere al hilo principal del proceso donde se encuentra el método setImpl del despertador. set Por supuesto, también se puede especificar el subproceso Handler. Para el TimeController utilizado en el JobSchedulerService anterior, está en system_server. El reloj de alarma configurado por el proceso se publica en el subproceso principal de system_server.
Tomando TimeController como ejemplo, se puede ver que a continuación se ingresará al proceso de mNextDelayExpiredListener.onAlarm()
[ -gt; TimeController.java]
Si no hay controlador se especifica aquí, el método de devolución de llamada onAlarm se ejecuta en el hilo principal de system_server de forma predeterminada.
Hay tres tipos de configuraciones de despertador:
El tipo tiene 4 tipos: