Red de conocimiento informático - Problemas con los teléfonos móviles - startProceso de inicio del servicio

startProceso de inicio del servicio

Código fuente relevante:

Hay dos formas de iniciar un servicio, una es startService y la otra es bindService. startService y bindService ejecutarán métodos diferentes respectivamente. Por ejemplo, startService ejecutará el método onStartCommand, mientras que bindService ejecutará los métodos onBind y onUnbind.

El método de inicio startService no se comunica y su ciclo de vida del servicio no está sincronizado con el ciclo de vida de la persona que llama. El método de inicio de binderService no se comunica con la persona que llama. El método de inicio de binderService puede comunicarse a través de Binder. El siguiente es el diagrama de flujo de startService:

El método startServiceCommon primero verifica la intención y luego llama al método AMS.startService a través de la comunicación Binder, donde el parámetro mMainThread.getApplicationThread() es un Binder a través del cual AMS llama al método AMS.startService. AMS se comunica con la persona que llama a través de un Binder y el proceso es el siguiente:

La función de ActivityManagerServer en el proceso startService es aproximadamente encontrar el Servive correspondiente y llamar a su ciclo de vida.

El método AMS.startService verifica el proceso de la persona que llama y luego llama al método ActiveServices.startServiceLocked pasando directamente todos los parámetros a la clase ActiveServices.

El método ActiveServices.startServiceLocked obtendrá el registro de proceso del extremo que llama y obtendrá el registro de servicio y el registro de proceso del extremo llamado para determinar si el servicio iniciado esta vez debe agregarse a la cola de retraso. Finalmente, se llamará al método startServiceInnerLocked para continuar ejecutando la lógica.

Obtenga el proceso correspondiente al servicio. Si el proceso se crea correctamente y se inicia sin demora, llame al método realStartServiceLocked para llamar a algunos métodos del servicio.

El método realStartServiceLocked llama a ScheduleCreateService, ScheduleServiceArgs y ScheduleServiceArgs de app.thread, que es la clase de subproceso de aplicación del proceso donde se encuentra el servicio. Este app.thread es la clase ApplicationThread del proceso donde se ejecuta el servicio.

Primero, creará un objeto ContextImpl, luego creará un objeto de Servicio a través de la reflexión, luego pasará el recurso al objeto de Servicio llamando al método Service.attach y finalmente llamará al objeto Service.onCreate y enviará una cancelación al mensaje AMS retrasado.

Busque el servicio correspondiente según el caché, ejecute el método Service.onStartCommand() y luego envíe un mensaje de cancelación de retraso ANR a AMS.

Veamos qué sucede cuando detenemos el servicio:

Se ejecuta el método Service.onDestroy y se realiza la limpieza del servicio y del ContextImpl correspondiente. El ciclo de vida del servicio iniciado por startService no está sincronizado con la persona que llama, por lo que debemos llamar manualmente a la operación de detención nosotros mismos: stop Llame manualmente a la operación de detención: stopSelf() o stopService()