android android-5.0-lollipop android-jobscheduler gcmtaskservice

android - Algunas preguntas sobre GcmTaskService



android-5.0-lollipop android-jobscheduler (2)

Jacktech24 hizo un muy buen trabajo, pero lo intentaré también en caso de que haya preguntas pendientes.

  1. Parece que requiere el uso de Google Play Services (aquí) (excepto cuando se usa la versión Lollipop de Android, que usará el JobScheduler normal). ¿Qué debo hacer en caso de que los servicios de Google Play no estén disponibles? *

    No puedes usar esta API si Google Play Services no está disponible. Más bien, la biblioteca cliente de Google Play Services está diseñada para solicitar que el usuario descargue e instale los servicios de Google Play si detecta que falta, pero no creo que el GcmNetworkManager haga esto.

  2. ¿Cuál es el comportamiento predeterminado de una tarea, en caso de que no use "setRequiredNetwork"? ¿Es "NETWORK_STATE_ANY"? *

    El javadoc describe cuál es el predeterminado.

  3. Los documentos dicen sobre lo que se devolvió de onRunTask, puedo devolver cualquiera de los valores "RESULT_FAILURE", "RESULT_RESCHEDULE", "RESULT_SUCCESS" (información aquí). Parece que las opciones de FALLO y ÉXITO harán lo mismo: eliminar la tarea de la cola. ¿Es verdad? Si es así, ¿cuál es exactamente la diferencia entre ellos? ¿Funcionan de manera diferente? *

    La única diferencia entre estos 2 es que en el db shell dumpsys mostrará lo que devolvió, por lo que puede usarlo para solucionar problemas. La otra razón es que si la tarea falla, es extraño que el cliente devuelva un "éxito".

  4. ¿Se usan "TaskParams" solo para la etiqueta de la tarea? ¿Puedo pasar un paquete a la tarea utilizando la API? De lo contrario, necesitaría establecer una base de datos para almacenar lo que debería pasarse a las tareas, ¿verdad? *

    En la próxima versión de GmsCore, se debe admitir la capacidad de agregar un paquete a la tarea.

  5. ¿Es posible que la aplicación obtenga la cola de las tareas? Sé que es posible usar adb, pero ¿es posible usar la API también?

    No, no es posible. En su lugar, debe realizar la cancelación cuando lo desee y, si la tarea no está allí, será un no-op. Del mismo modo, debe programar la tarea en el punto de su código donde haya consultado la lista de tareas. use setUpdateCurrent = false para asegurarse de que no actualice la tarea preexistente. El AlarmManager funciona de manera similar, ya que configuraría la alarma independientemente de si ya estaba configurada, ya que la api fue diseñada para seguir esto.

  6. Dicen (aquí) que cada tarea tiene un wakelock de hasta 3 minutos. ¿Qué se debe hacer si la tarea necesita más que eso? ¿Debería adquirir otro wakelock por sí mismo? ¿La API advertirá que el wakelock fue lanzado? Esto es lo que dicen los documentos: *

    Sí, la aplicación debería adquirir su propio wakelock y todo estará bien. La razón por la que el programador libera el wakelock después de 3 minutos es porque, en la práctica, tener un tiempo de espera de wakelock ilimitado solo hace que sea muy difícil rastrear los errores de descarga de la batería. Si necesita más de 3 minutos, tiene un caso de uso lo suficientemente sofisticado como para profundizar en cómo funcionan las API de PowerManager y llamar usted mismo a adquirir () / release () (es realmente muy simple, el hecho de que el administrador de red lo haga). Para ti es más una cortesía que cualquier otra cosa.

  7. Dicen (aquí) que todas las tareas de red se eliminan cada vez que la aplicación se actualiza / reemplaza, y hay una llamada a "onInitializeTasks" cuando esto sucede, y que puede volver a programarlas nuevamente. ¿Cómo puedo volver a programar las tareas? No creo que pueda obtener la lista de tareas ... *

    Usted vuelve a programar las tareas de la misma manera que las programó en primer lugar. Cualquiera que sea la función que usó para programarlas, llame a esa función desde GcmTaskService # onInitializeTasks. Esto se hizo para evitar tareas persistentes en los cambios de la lógica de la aplicación. Considere la situación en la que un desarrollador cambia su calendario de tareas y comienza a usar una etiqueta diferente. Tendrían que llamar a cancel (old_tag) después de haber detectado la actualización (para lo cual tendrían que agregar más código), lo que significaría que necesitarían una referencia a la etiqueta antigua (no utilizada) incluso en su nuevo código. Esto implicaría que una etiqueta es un identificador estable que no debería cambiar a través de las actualizaciones de la aplicación, lo que no debería ser un requisito para esta API.

  8. ¿Es posible decirle a la tarea que prefiera horas específicas durante el día? Por ejemplo, entre las 14: 00-15: 00? *

    No, este tipo de programación en segundo plano causa todo tipo de problemas con el pastoreo en grandes poblaciones de dispositivos. Es decir, si 1 dispositivo ejecuta un trabajo a las 15:00, es probable que esté bien. Pero si 1x10e6 lo hace de repente su servidor está en serios problemas.

  9. Me he dado cuenta de que si programa una tarea y luego fuerza o detiene los datos de la aplicación, la tarea seguirá ejecutándose. ¿Cómo puedo evitar este comportamiento? *

    Desafortunadamente, no puede, pero esto no es intencional y debería cambiarse; no debería haber una manera de ejecutar una aplicación después de que el usuario la haya detenido explícitamente.

Fondo

Quería usar el nuevo JobScheduler API que se presentó en Lollipop, pero lamentablemente no tiene un puerto oficial para pre-Lollipop.

Sin embargo, existe el GcmTaskService, que proporciona funcionalidades muy similares.

El problema

Esta API es bastante nueva, por lo que hay muy pocos lugares donde buscar información sobre cómo usarla ( here y here , por ejemplo).

Las preguntas

Tengo algunas preguntas sobre esta nueva API:

  1. Parece que requiere el uso de Google Play Services ( here ) (excepto cuando se usa la versión Lollipop de Android, que usará el JobScheduler normal). ¿Qué debo hacer en caso de que los servicios de Google Play no estén disponibles?

  2. Parece que aunque he usado "setPersisted (true)" para una tarea repetida, cuando reinicio el dispositivo, no se volverá a llamar a la tarea. ¿Cómo? EDIT: eso es porque perdí un permiso de RECEIVE_BOOT_COMPLETED.

  3. ¿Cuál es el comportamiento predeterminado de una tarea, en caso de que no use "setRequiredNetwork"? ¿Es "NETWORK_STATE_ANY"?

  4. Los here dicen sobre lo que se devolvió de onRunTask, puedo devolver cualquiera de los valores "RESULT_FAILURE", "RESULT_RESCHEDULE", "RESULT_SUCCESS" (información here ). Parece que las opciones de FALLO y ÉXITO harán lo mismo: eliminar la tarea de la cola. ¿Es verdad? Si es así, ¿cuál es exactamente la diferencia entre ellos? ¿Funcionan de manera diferente?

  5. ¿ TaskParams usan " TaskParams " solo para la etiqueta de la tarea? ¿Puedo pasar un paquete a la tarea utilizando la API? De lo contrario, necesitaría establecer una base de datos para almacenar lo que debería pasarse a las tareas, ¿verdad?

  6. ¿Es posible que la aplicación obtenga la cola de las tareas? Sé que es posible usar adb, pero ¿es posible usar la API también?

  7. Dicen ( here ) que cada tarea tiene un wakelock de hasta 3 minutos. ¿Qué se debe hacer si la tarea necesita más que eso? ¿Debería adquirir otro wakelock por sí mismo? ¿La API advertirá que el wakelock fue lanzado? Esto es lo que dicen los documentos:

El programador mantendrá un PowerManager.WakeLock para su servicio, sin embargo, después de tres minutos de ejecución, si su tarea no ha regresado, se considerará que se ha agotado el tiempo de espera y se liberará el wakelock. Reprogramar su tarea en este punto no tendrá ningún efecto. Si sospecha que su tarea se ejecutará por más tiempo, debe iniciar su propio servicio explícitamente o usar algún otro mecanismo; Esta API está diseñada para operaciones de red relativamente rápidas.

  1. Dicen ( here ) que todas las tareas de red se eliminan cada vez que la aplicación se actualiza / reemplaza, y hay una llamada a "onInitializeTasks" cuando esto sucede, y que puede volver a programarlas nuevamente. ¿Cómo puedo volver a programar las tareas? No creo que pueda obtener la lista de tareas ...

  2. ¿Es posible decirle a la tarea que prefiera horas específicas durante el día? Por ejemplo, entre las 14: 00-15: 00?

  3. Me he dado cuenta de que si programa una tarea y luego fuerza o detiene los datos de la aplicación, la tarea seguirá ejecutándose. ¿Cómo puedo evitar este comportamiento?


Puede encontrar respuestas a la mayoría de sus preguntas aquí.

https://github.com/jacktech24/gcmnetworkmanager-android-example/blob/master/README.md

A las respuestas que no están respondidas allí.

7: No se le notificará cuando se elimine wakelock y, como se dice en la documentación, esta API es solo para tareas cortas. Si tiene más tiempo, escriba su propia implementación.

9: No, no puedes a partir de ahora, la API no lo permite

10: Eso es porque los servicios de Google Play se están ocupando de ello, y no hay forma de evitarlo. Debe detectar en el servicio si la aplicación está configurada (supongo que ese es su problema), por ejemplo. se crea la configuración, etc. y eventualmente se cancelan todas las tareas cuando se llama a una de ellas.