Android FusedLocationProvider перестает указывать местоположение, когда телефон находится в режиме ожидания

Я работаю над приложением для отслеживания местоположения, используя FusedLocationProvider. У меня есть фоновая служба, которая отслеживает местоположение телефона каждые 5 минут.

С ним все работает хорошо, но как только телефон простаивает, через 3-4 часа фоновая служба перестает определять местоположение. Когда пользователь разблокирует телефон, отслеживание начнется снова.

Может кто-нибудь, пожалуйста, помогите мне, что может быть причиной проблемы?


person Aspiring Developer    schedule 15.03.2016    source источник


Ответы (3)


Одной из возможностей может быть Android M Doze Mode. Когда устройство отключено от сети и находится в стационарном состоянии в течение определенного периода времени, система пытается сэкономить заряд батареи, ограничивая доступ приложений к службам, интенсивно использующим ЦП. Режим ожидания запускается примерно через 1 час бездействия, периодические задачи и т. д. затем планируются на периоды обслуживания. Когда пользователь разблокирует устройство, спящий режим снова отключается.

Дополнительную информацию о режиме Doze Mode можно найти в документации для разработчиков: http://developer.android.com/training/monitoring-device-state/doze-standby.html

person p2pkit    schedule 16.03.2016

Возможно, ваша служба останавливается, потому что телефону нужно освободить память, поэтому он убивает вашу службу. Убедитесь, что ваша служба настроена как служба переднего плана.

Служба переднего плана — это служба, которая считается чем-то, о чем пользователь активно осведомлен, и, следовательно, не является кандидатом на уничтожение системой при нехватке памяти. Служба переднего плана должна предоставлять уведомление для строки состояния, которая помещается под заголовком «Текущие», что означает, что уведомление нельзя отклонить, если только служба не будет остановлена ​​или удалена из переднего плана. http://developer.android.com/guide/components/services.html

Notification notification = new Notification(R.drawable.icon, getText(R.string.ticker_text),
        System.currentTimeMillis());

Intent notificationIntent = new Intent(this, ExampleActivity.class);

PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, notificationIntent, 0);

notification.setLatestEventInfo(this, getText(R.string.notification_title),
        getText(R.string.notification_message), pendingIntent);

startForeground(ONGOING_NOTIFICATION_ID, notification);
person mikebertiean    schedule 17.03.2016
comment
Служба установлена ​​на переднем плане и закреплена - person Aspiring Developer; 21.03.2016

Android переведет ваш сервис в спящий режим после некоторого простоя. Вы можете использовать WakeLock, чтобы предотвратить это.

public int onStartCommand (Intent intent, int flags, int startId)
{
    PowerManager mgr = (PowerManager)getSystemService(Context.POWER_SERVICE);
    mWakeLock = mgr.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "MyWakeLock");
    mWakeLock.acquire();
    ...

    return START_STICKY;
}

public void onDestroy(){
    ...
    mWakeLock.release();
}
person fnieto - Fernando Nieto    schedule 29.03.2016