FusedLocationProviderClient перестает указывать местоположение в режиме ожидания

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

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

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

LocationUpdatesBroadcastReceiver

public class LocationUpdatesBroadcastReceiver extends BroadcastReceiver {
public static final String TAG = "LUBroadcastReceiver";

public static final String ACTION_PROCESS_UPDATES =
        "com.orangeapp.discountnotifier.receiver.action" +
                ".PROCESS_UPDATES";

@Override
public void onReceive(Context context, Intent intent) {
    if (intent != null) {
        final String action = intent.getAction();
        if (ACTION_PROCESS_UPDATES.equals(action)) {
            LocationResult result = LocationResult.extractResult(intent);
            if (result != null) {

                List<Location> locations = result.getLocations();
                Utils.setLocationUpdatesResult(context, locations);
//                    Utils.checKOffersByLatLng(context, locations);
                    Utils.sendNotification(context, Utils.getLocationResultTitle(context, locations));
                Log.e(TAG, Utils.getLocationUpdatesResult(context));
            }
        }
    }
}
}

Основная деятельность

private PendingIntent getPendingIntent() {

    // Note: for apps targeting API level 25 ("Nougat") or lower, either
    // PendingIntent.getService() or PendingIntent.getBroadcast() may be used when requesting
    // location updates. For apps targeting API level O, only
    // PendingIntent.getBroadcast() should be used. This is due to the limits placed on services
    // started in the background in "O".

    // TODO(developer): uncomment to use PendingIntent.getService().
//        Intent intent = new Intent(this, LocationUpdatesIntentService.class);
//        intent.setAction(LocationUpdatesIntentService.ACTION_PROCESS_UPDATES);
//        return PendingIntent.getService(this, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);

    Intent intent = new Intent(this, LocationUpdatesBroadcastReceiver.class);
    intent.setAction(LocationUpdatesBroadcastReceiver.ACTION_PROCESS_UPDATES);
    return PendingIntent.getBroadcast(this, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);

}

protected void startLocationUpdates() {

    try {
        Log.i(TAG, "Starting location updates");
        Utils.setRequestingLocationUpdates(this, true);
        mFusedLocationClient.requestLocationUpdates(mLocationRequest, getPendingIntent());
    } catch (Exception e) {
        Utils.setRequestingLocationUpdates(this, false);
        e.printStackTrace();
    }

}

1 ответ

Лучше воспользоваться услугами. Службы предназначены для выполнения действий в фоновом режиме в течение некоторого периода времени, независимо от того, что пользователь делает на переднем плане (пользователь может переключаться между действиями). Хорошим примером может служить служба музыкального проигрывателя - пользователь начинает воспроизводить музыку через приложение музыкального проигрывателя, но когда он выходит из приложения, музыка продолжает воспроизводиться.

Лучший способ получить пользовательское местоположение GPS в фоновом режиме в Android

Также смотрите эту ссылку:

Почему мой BroadcastReceiver перестает получать через некоторое время

Другие вопросы по тегам