Фоновые операции в режиме ожидания, спящий режим на Android 6+

Я создал приложение для Android, которое каждые 5 минут отправляет координаты на мой сервер, после версии 6.0, когда телефон переходит в спящий режим, будильник (я тестировал все типы будильника) срабатывает каждые 1 или 2 часа, хотя приложение находится в белом списке!

Я создал уведомление Firebase, отправляющее только данные, которые запускают службы, но результат тот же, onMessageReceived запускается примерно через 10 минут после выключения экрана и запускается снова, когда телефон просыпается... Я вижу все больше и больше тем, касающихся этой ситуации, но нет один предлагает рабочие решения.

Кто-нибудь знает способ, с помощью которого я могу отправлять координаты в фоновом режиме без остановки?

Пожалуйста, помогите мне спасибо


person Cristian    schedule 25.05.2017    source источник
comment
Насколько я знаю, вы не можете принудительно отображать уведомление с конкретным интервалом, потому что система будет группировать и выполнять эти пакетные действия во время окон, которые происходят через определенные промежутки времени (которые мы, как разработчик, не можем контролировать).   -  person azizbekian    schedule 25.05.2017
comment
Мне нужно только рабочее решение для отправки координат каждые 5 минут каждый раз... больше ничего! Приложение всегда в фоне....   -  person Cristian    schedule 25.05.2017
comment
Разве геозона не будет лучшим решением для этого? Сделайте геозону и сработайте, если пользователь уйдет. Таким образом, вы можете минимизировать сетевой трафик и нагрузку на сервер.   -  person Shmuel    schedule 25.05.2017


Ответы (2)


@Cristian, вам нужно использовать JobScheduler для выполнения фоновой задачи выше API 21, это будет работать, если вы обратитесь по ссылке ниже.

Вот пример периодического выполнения операции JobService:

ComponentName serviceComponent = new ComponentName(context, yourJobService.class);
JobInfo.Builder builder = new JobInfo.Builder(0, serviceComponent);
builder.setRequiredNetworkType(JobInfo.NETWORK_TYPE_UNMETERED); 
builder.setRequiresDeviceIdle(false); 
builder.setRequiresCharging(false); 
builder.setPeriodic(60000); // <<<<----  60 seconds interval

JobScheduler jobScheduler = (JobScheduler)context.getSystemService(Context.JOB_SCHEDULER_SERVICE);
jobScheduler.schedule(builder.build());

https://developer.android.com/reference/android/app/job/JobScheduler.html

https://github.com/googlesamples/android-JobScheduler

OR

вы можете использовать firebase jobdispatcher, он также позаботится о времени автономной работы устройства, а также совместим с API 9

https://github.com/firebase/firebase-jobdispatcher-android

person Piyush Patel    schedule 25.05.2017
comment
По вашему предложению я создал в своем приложении для определения местоположения Диспетчер заданий Firebase, я провожу тест, чтобы увидеть, работает ли JobService в режиме ожидания. - person Cristian; 25.05.2017
comment
Это звучит хорошо, давайте свяжемся, если у вас возникнут какие-либо проблемы. - person Piyush Patel; 25.05.2017
comment
Я тестировал на своем Xiami Redmi 3s с Android 6.0.1, jobService останавливается через 1 час в фоновом режиме... когда я включаю экран, он сразу же перезагружается! плохой режим сна! - person Cristian; 25.05.2017
comment
Я проверял с помощью setAlarmClock каждые 5 минут, и будильник всегда срабатывал. Нет остановки или отсрочки в спящем режиме! Это уникальный метод работы? - person Cristian; 26.05.2017
comment
Если с аккумулятором вашего устройства все в порядке, то все в порядке - person Piyush Patel; 27.05.2017
comment
Я тестировал в течение 24 часов, заряд батареи начинался с 37%, а затем с 28% ... вроде все в порядке! Мне нужно работать 24 часа, потому что это приложение используется водителями, которые получают оповещения, если они опаздывают из-за сна или чего-то еще. - person Cristian; 27.05.2017

У меня есть MyJobService, расширяющий JobService

String TAG = "heyTaxiLOG";

@Override
public boolean onStartJob(JobParameters job) {
    // Do some work here
    Log.d(TAG,"JobService on Start");
    //Start Service extends IntentService
    startService(new Intent(this, GPSTracker.class));
    return false; // Answers the question: "Is there still work going on?"
}

@Override
public boolean onStopJob(JobParameters job) {
    return false; // Answers the question: "Should this job be retried?"
}

GPSTracker как IntentService, который берет местоположение от Google, с этим проблем нет, он слишком длинный для поста!

и диспетчер вызывается в методе OnCreate в MainActivity

FirebaseJobDispatcher dispatcher = new FirebaseJobDispatcher(new GooglePlayDriver(context));

Job myJob = dispatcher.newJobBuilder()
    // the JobService that will be called
    .setService(MyJobService.class)
    // uniquely identifies the job
    .setTag("GPS")
    // one-off job
    .setRecurring(true)
    // don't persist past a device reboot
    .setLifetime(Lifetime.FOREVER)
    // start between 0 and 60 seconds from now
    .setTrigger(Trigger.executionWindow(180, 180))
    // don't overwrite an existing job with the same tag
    .setReplaceCurrent(true)
    // retry with exponential backoff
    .setRetryStrategy(RetryStrategy.DEFAULT_EXPONENTIAL)
    // constraints that need to be satisfied for the job to run
    .setConstraints(
            Constraint.ON_ANY_NETWORK
    )
    //.setExtras(myExtrasBundle)
    .build();

dispatcher.mustSchedule(myJob);

Диспетчер заданий Firebase когда-нибудь запускался? тоже в спящем режиме?

person Cristian    schedule 25.05.2017