No se ejecuta el Programador de trabajos en Android N
Job Scheduler está funcionando como se esperaba en los dispositivos Android Marshmallow y Lollipop, pero no se está ejecutando y Nexus 5x (Android N Preview).
Código para programar el trabajo
- Android.os.TransactionTooLargeException en Nougat
- Detectar la aplicación actual en Android Nougat 7. + versión
- Android ClipPath de Nougat no funciona durante la animación
- ¿Cuál es el significado de E / OpenGLRenderer: saveGfxinfoFileDisabled - habilitado mostrando demasiadas veces en los registros
- Android 7.0 scan sin resultados
ComponentName componentName = new ComponentName(MainActivity.this, TestJobService.class.getName()); JobInfo.Builder builder; builder = new JobInfo.Builder(JOB_ID, componentName); builder.setPeriodic(5000); JobInfo jobInfo; jobScheduler = (JobScheduler) getSystemService(Context.JOB_SCHEDULER_SERVICE); jobInfo = builder.build(); int jobId = jobScheduler.schedule(jobInfo);
El servicio se define en manifiesto como:
<service android:name=".TestJobService" android:permission="android.permission.BIND_JOB_SERVICE" />
¿Hay alguien que tenga este problema en Android N (Vista previa)?
- Maneje los cambios de red en android 7 Turrón
- Deshabilitar la función de ventanas múltiples para Android N no funciona para una actividad
- No se puede encontrar ColorStateList de ID de recurso extraíble sólo en Android Nougat
- Cómo diseñar una página que soporte Android N (turrón) API 24 (diseño de ventanas múltiples)?
- Android toolchain jack no reconoce java.util.function.Predicate en secuencia
- Faltan los extras de Android 7
- Acepta programáticamente la llamada en Nougat
- ¿Android N no está enviando android.net.conn.CONNECTIVITY_CHANGE?
En Android Nougat la llamada al método setPeriodic(long intervalMillis)
hace uso de setPeriodic (long intervalMillis, long flexMillis)
para programar trabajos periódicos.
Según la documentación:
JobInfo.Builder setPeriodic (intervalo largoMillis, flexMillis largo)
Especifique que este trabajo debe repetirse con el intervalo y la flexión proporcionados. El trabajo se puede ejecutar en cualquier momento en una ventana de longitud flexible al final del período.
IntervalMillis long: Intervalo de milisegundos para el cual este trabajo se repetirá. Se aplica un valor mínimo de getMinPeriodMillis ().
FlexMillis largo: Flex de milisegundo para este trabajo. La flexión se sujeta para ser al menos getMinFlexMillis () o 5 por ciento del período, lo que sea mayor.
Ejemplo de trabajo periódico programado durante 5 segundos:
private static final int JOB_ID = 1001; private static final long REFRESH_INTERVAL = 5 * 1000; // 5 seconds JobInfo jobInfo = new JobInfo.Builder(JOB_ID, serviceName) .setPeriodic(REFRESH_INTERVAL) .setExtras(bundle).build();
El código anterior funciona bien en Lollipop y Marshmallow, pero cuando se ejecuta en Nougat se dará cuenta del siguiente registro:
W/JobInfo: Specified interval for 1001 is +5s0ms. Clamped to +15m0s0ms W/JobInfo: Specified flex for 1001 is +5s0ms. Clamped to +5m0s0ms
Puesto que hemos establecido el intervalo de actualización periódica a 5 segundos, que es menor que el umbral getMinPeriodMillis()
. Android Nougat hace cumplir el getMinPeriodMillis()
.
Como solución, utilizo el siguiente código para programar trabajos a intervalos periódicos si el intervalo de trabajo es inferior a 15 minutos.
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(); }
Ejemplo de JobService ejemplo:
public class SampleService extends JobService { @Override public boolean onStartJob(JobParameters params) { doSampleJob(params); return true; } @Override public boolean onStopJob(JobParameters params) { return false; } public void doSampleJob(JobParameters params) { // Do some heavy operation ...... // At the end inform job manager the status of the job. jobFinished(params, false); } }
- ¿Hay alguna manera de usar Roboguice y ActionbarSherlock en un proyecto?
- Cómo crear emulador de Android en línea de comandos con opciones?