web-dev-qa-db-fra.com

JobIntentService ne démarre pas immédiatement sur Android 8.0

J'ai implémenté JobIntentService pour effectuer certaines tâches d'arrière-plan qui fonctionnent correctement sur les appareils Android plus anciens (avant Android O). Je vois que l'intention est gérée immédiatement, mais sur le périphérique Android O, il y a un certain délai avant l'exécution de JobIntentService.onHandleWork(). Je comprends que les intentions sont gérées en série mais je vois le délai même s’il n’ya pas d’intention en cours de traitement dans la file d’attente. Est-ce parce que la planification des tâches est gérée en interne dans Android O? 

Ici , dit un document Android 

"Lorsqu’il s’exécute en tant que service pré-O, le travail de mise en file d'attente démarre généralement le service immédiatement, que le périphérique Soit assoupi ou dans d’autres conditions. Lorsqu’il est exécuté en tant que Job, il sera soumis aux stratégies standard de JobScheduler pour un travail avec une setOverrideDeadline(long) de 0: le travail ne sera pas exécuté tant que le périphérique est en train de somnoler; il peut être retardé plus souvent qu'un service si le périphérique est. pression de la mémoire avec beaucoup de demande pour exécuter des travaux ".

La déclaration ci-dessus est-elle valable même si mon application est ciblée sur l'API 25 mais s'exécute sur un système d'exploitation Android O? Si tel est le cas, existe-t-il une solution permettant de démarrer le service/la tâche immédiatement sur Android O?

Ma mise en œuvre actuelle:

public class MySampleService extends JobIntentService {

    private static final int JOB_ID = 1000;

    public MySampleService() {

    }

    /**
     * Convenience method for enqueuing work in to this service.
     */
    public static void enqueueWork(Context context, Intent work) {
        enqueueWork(context, MySampleService.class, JOB_ID, work);
    }

    /**
     * Interpret the incoming intent actions and handle it appropriately.
     * @param workIntent
     */
    @Override
    protected void onHandleWork(@NonNull Intent workIntent) {
        if(workIntent==null || workIntent.getAction() == null){
            return;
        }
        /* This gets printed immediately on pre Android O devices but not otherwise*/
        System.out.println("Intent Handled");
    }
}
6
Prudhvi

La déclaration ci-dessus est-elle valable même si mon application est ciblée sur l'API 25 mais s'exécute sur un système d'exploitation Android O?

Oui. Le comportement JobIntentService - en utilisant JobScheduler ou non - est dicté par la version d'Android sur laquelle vous exécutez. Votre targetSdkVersion n'a aucun impact.

Si tel est le cas, existe-t-il une solution permettant de démarrer le service/la tâche immédiatement sur Android O?

N'utilisez pas JobIntentService. Utilisez un service de premier plan régulier. Par définition, JobScheduler peut planifier les travaux comme bon lui semble, et rien ne garantit qu’il exécutera immédiatement un travail.

2
CommonsWare