it-swarm.com.ru

JobIntentService не запускается сразу на Android 8.0

Я реализовал JobIntentService для выполнения некоторых фоновых задач, которые отлично работают на старых устройствах Android (до Android O). Я вижу, что намерение обрабатывается немедленно, но на устройстве Android O есть некоторая задержка перед выполнением JobIntentService.onHandleWork(). Я понимаю, что намерения обрабатываются последовательно, но я вижу задержку, даже если в очереди не обрабатываются намерения. Это потому, что планирование заданий обрабатывается внутри Android O? 

Здесь , в документе Android написано 

«При запуске в качестве службы предварительной подготовки действие постановки в очередь....., Как правило, запускает службу немедленно, независимо от того, работает ли устройство Или в других условиях. При работе в качестве задания оно будет подчиняться стандартным политикам JobScheduler для задания с setOverrideDeadline(long), равным 0: задание не будет выполняться, пока устройство дремлет, оно может быть задержано больше, чем служба, если устройство находится в состоянии сильного нехватка памяти с большим спросом для выполнения заданий ".

Является ли приведенный выше оператор действительным, даже если мое приложение предназначено для API 25, но работает на ОС Android O? Если да, то есть ли способ немедленного запуска службы/задания на Android O?

Моя текущая реализация:

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

Является ли приведенный выше оператор действительным, даже если мое приложение предназначено для API 25, но работает на ОС Android O?

Да. Поведение JobIntentService - с использованием JobScheduler или нет - определяется версией Android, на которой вы работаете. Ваша targetSdkVersion не влияет.

Если да, то есть ли способ немедленного запуска службы/задания на Android O?

Не используйте JobIntentService. Используйте регулярный сервис переднего плана. По определению, JobScheduler может планировать задания по своему усмотрению, и нет никакой гарантии, что он выполнит задание немедленно.

2
CommonsWare