Dans Android Nougat, le setPeriodic(long intervalMillis)
fait appel à la méthode setPeriodic (long intervalMillis, long flexMillis)
pour planifier des travaux périodiques.
Conformément à la documentation :
JobInfo.Builder setPeriodic (long intervalMillis, long flexMillis)
Indiquez que cette tâche doit se répéter avec l'intervalle et le paramètre flex. Le travail peut s'exécuter à tout moment dans une fenêtre de longueur flex à la la fin de la période.
intervalleMillis long : Intervalle en millisecondes pendant lequel cette tâche sera répétée. Une valeur minimale de getMinPeriodMillis() est appliquée.
flexMillis long : Flex en millisecondes pour ce travail. Le flex est fixé à au moins getMinFlexMillis() ou 5 % de la période, la valeur la plus élevée étant retenue.
Exemple de travail périodique programmé pour 5 secondes :
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();
Le code ci-dessus fonctionne bien dans Lollipop & Marshmallow mais lorsque vous l'exécutez dans Nougat, vous remarquerez le log suivant :
W/JobInfo: Specified interval for 1001 is +5s0ms. Clamped to +15m0s0ms
W/JobInfo: Specified flex for 1001 is +5s0ms. Clamped to +5m0s0ms
Puisque nous avons fixé l'intervalle de rafraîchissement périodique à 5 secondes, ce qui est inférieur au seuil fixé. getMinPeriodMillis()
. Android Nougat applique le getMinPeriodMillis()
.
Comme solution de rechange, j'utilise le code suivant pour planifier les tâches à intervalles périodiques si l'intervalle des tâches est inférieur à 15 minutes.
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();
}
Exemple de service d'emploi :
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);
}
}
0 votes
Où essayez-vous de trouver un emploi ? Je veux dire, c'est un récepteur de diffusion ou quelque chose comme ça ?
0 votes
@rom4ek c'est dans l'activité pour le moment, car c'est un exemple d'application.