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 перестает получать через некоторое время