In Android Torrone la chiamata al metodo setPeriodic(long intervalMillis)
fa uso di setPeriodic (long intervalMillis, long flexMillis)
per pianificare i processi periodici.
Come per la documentazione:
JobInfo.Builder setPeriodic (lunghe intervalMillis, lunghe flexMillis)
Specificare che questo lavoro dovrebbe ripresentarsi con l'intervallo fornito e flex. Il lavoro può essere eseguito in qualsiasi momento in una finestra di lunghezza flessibile al alla fine del periodo.
intervalloMillis lungo: Intervallo del millisecondo per il quale questo lavoro verrà ripetuto. Viene applicato un valore minimo di getMinPeriodMillis().
flexMillis long: flex millisecondo per questo lavoro. Flex è bloccato per essere almeno getMinFlexMillis() o il 5% del periodo, a seconda di quale sia il più alto.
Lavoro di prova periodica prevista per 5 secondi:
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();
Il codice di cui sopra funziona bene in Lollipop & Marshmallow, ma quando si esegue in Torrone si noterà il seguente registro:
W/JobInfo: Specified interval for 1001 is +5s0ms. Clamped to +15m0s0ms
W/JobInfo: Specified flex for 1001 is +5s0ms. Clamped to +5m0s0ms
Poiché abbiamo impostato l'intervallo di aggiornamento periodico su 5 secondi che è inferiore alla soglia getMinPeriodMillis()
. Android Nougat applica lo getMinPeriodMillis()
.
Come soluzione temporanea, sto utilizzando il seguente codice per pianificare i lavori a intervalli periodici se l'intervallo di lavoro è inferiore a 15 minuti.
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();
}
Esempio esempio JobService:
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);
}
}
Dove provi a pianificare un lavoro? Voglio dire è un ricevitore broadcast o qualcosa del genere? – rom4ek
@ rom4ek è nell'attività al momento, come se fosse un'app campione. – kaibuki