una tasker que movil macro espaƱol como automatizar automatizada automatizaciĆ³n automate aplicacion actividades android job-scheduling android-7.0-nougat

tasker - macro android



Programador de tareas en Android N con menos de 15 minutos de intervalo (2)

Luché con lo mismo cuando quería configurar Job para actualizar una pequeña parte de los datos. Descubrí que la solución para este problema puede ser configurar el trabajo una vez más con la misma ID después de que llamé a jobFinished(JobParameters, boolean) . Creo que debería funcionar cada vez en el hilo principal.

Mi función para configurar el trabajo es así:

JobInfo generateRefreshTokenJobInfo(long periodTime){ JobInfo.Builder jobBuilder = new JobInfo.Builder(1L, new ComponentName(mContext, JobService.class)); jobBuilder.setMinimumLatency(periodTime); jobBuilder.setOverrideDeadline((long)(periodTime * 1.05)); jobBuilder.setRequiresDeviceIdle(false); return jobBuilder.build(); }

Cuando termine mi trabajo después de la primera llamada de Job, llamo en el hilo principal

jobFinished(mJobParameters, true); registerRefreshJob(5*60*1000L);

Esto volverá a programar mi trabajo una vez más por el mismo tiempo en la misma ID. Cuando el dispositivo está en estado inactivo, aún debe tener en cuenta la falta de bloqueos de despertador en modo de espera, por lo que es posible que su trabajo no se inicie con la frecuencia que desee. Se menciona en https://developer.android.com/about/versions/nougat/android-7.0-changes.html

Si el dispositivo está parado durante un cierto tiempo después de ingresar a Doze, el sistema aplica el resto de las restricciones de Doze a PowerManager.WakeLock, alarmas de AlarmManager, GPS y exploraciones de Wi-Fi. Independientemente de si se aplican algunas o todas las restricciones de Doze, el sistema activa el dispositivo para breves ventanas de mantenimiento, durante las cuales se permite el acceso a la red a las aplicaciones y puede ejecutar cualquier trabajo / sincronización diferida.

Parte de mi pregunta, cómo puedo configurar un trabajo con un intervalo de menos de 15 minutos en "Nougat", fue respondida por "blizzard" en su respuesta aquí:
Job Scheduler no se ejecuta en Android N
Explicó el problema y sugirió usar la siguiente solución:

JobInfo jobInfo; if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { jobInfo = new JobInfo.Builder(JOB_ID, serviceName) .setMinimumLatency(REFRESH_INTERVAL) .setExtras(bundle).build(); } else { jobInfo = new JobInfo.Builder(JOB_ID, serviceName) .setPeriodic(REFRESH_INTERVAL) .setExtras(bundle).build(); }

Sin embargo, utilizando el sugerido

.setMinimumLatency(REFRESH_INTERVAL)

sólo comienza el trabajo una vez;
pero, ¿cómo lo hago de forma periódica con un período de alrededor de 30 segundos en un dispositivo de turrón Android (sin usar el controlador o el administrador de alarmas)?


Si alguien todavía está tratando de superar la situación,

Aquí hay una solución para> = Android N (si desea configurar el trabajo periódico en menos de 15 minutos)

Compruebe que solo se utiliza setMinimumLatency. Además, si está ejecutando una tarea que lleva mucho tiempo, la próxima tarea se programará en, Hora de finalización del TRABAJO actual + PROVIDED_TIME_INTERVAL

.SetPeriodic (milis largos) funciona bien para niveles de API por debajo de Android N

@Override public boolean onStartJob(final JobParameters jobParameters) { Log.d(TAG,"Running service now.."); //Small or Long Running task with callback //Reschedule the Service before calling job finished if(android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) scheduleRefresh(); //Call Job Finished jobFinished(jobParameters, false ); return true; } @Override public boolean onStopJob(JobParameters jobParameters) { return false; } private void scheduleRefresh() { JobScheduler mJobScheduler = (JobScheduler)getApplicationContext() .getSystemService(JOB_SCHEDULER_SERVICE); JobInfo.Builder mJobBuilder = new JobInfo.Builder(YOUR_JOB_ID, new ComponentName(getPackageName(), GetSessionService.class.getName())); /* For Android N and Upper Versions */ if (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { mJobBuilder .setMinimumLatency(60*1000) //YOUR_TIME_INTERVAL .setRequiredNetworkType(JobInfo.NETWORK_TYPE_ANY); }

ACTUALIZACIÓN: si está considerando que su trabajo repetitivo se ejecute mientras está en el modo Doze y está pensando en JobScheduler, para su información : Los JobSchedulers no pueden ejecutarse en el modo Doze.

No he discutido sobre el Dozing porque estábamos hablando de JobScheduler. Gracias, @Elletlar , por señalar que algunos pueden pensar que se ejecutará incluso cuando la aplicación esté en modo dormido, lo que no es el caso.

Para el modo de reposo, AlarmManager aún ofrece la mejor solución. Puede usar setExactAndAllowWhileIdle () si desea ejecutar su trabajo periódico en el período de tiempo exacto o usar setAndAllowWhileIdle () si es flexible.

También puede usar setAlarmClock () ya que el dispositivo siempre sale del modo de reposo para el reloj de alarma y vuelve al modo de reposo. Otra forma es utilizar FCM.

Referencia: Restricciones Doze

https://developer.android.com/training/monitoring-device-state/doze-standby