Служба определения местоположения в режиме ожиданияAndroid

Форум для тех, кто программирует под Android
Ответить Пред. темаСлед. тема
Anonymous
 Служба определения местоположения в режиме ожидания

Сообщение Anonymous »

В моем приложении есть требование постоянно отправлять местоположение, даже если приложение находится в фоновом режиме или было закрыто.
Для этого у меня есть служба приоритетного плана, которая работает отлично, но когда устройство находится в режиме ожидания, обновления местоположения становятся реже, с интервалом до нескольких часов.
Вероятно, это связано с мерами энергосбережения ОС, но для этого случае использования, его нужно как-то переопределить.
Я пробовал использовать WakeLock.acquire() в onStart, что не имело никакого значения, а также перезапускал службу через AlarmManager, но тогда он вообще не получает никаких обновлений местоположения при запуске в фоновом режиме.
Как я могу гарантировать, что служба продолжает работать хотя бы каждые 5 минут, даже за счет батареи жизнь?
public class GetLocationService extends Service {
private static final int NOTIF_ID = 2;
private static final int TWO_MINUTES = 1000 * 60 * 2;
private LocationManager mLocationManager;
private LocationListener mLocationListener;
private PowerManager.WakeLock wakeLock;

public IBinder onBind(Intent intent) {
return null;
}

@Override
public int onStartCommand(Intent intent, int flags, int startId) {
Log.d("SERVICE_LIFECYCLE", "GetLocationService STARTED");
Notification noti = createNotification("Location Service", "Running", "Location Service");
startForeground(NOTIF_ID, noti);
return super.onStartCommand(intent, flags, startId);
}

@Override
public void onCreate() {
PowerManager powerManager = (PowerManager) getSystemService(Context.POWER_SERVICE);
wakeLock = powerManager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "GetLocationService::WakeLock");
wakeLock.acquire();

mLocationListener = new LocationListener() {
@Override
public void onLocationChanged(Location location) {
Log.d("GetLocationService", "Location update received");
Log.d("GetLocationService", "save position");
}

@Override
public void onProviderDisabled(String provider) {
Log.d("GetLocationService", "Provider disabled");
}

@Override
public void onProviderEnabled(String provider) {
Log.d("GetLocationService", "Provider enabled");
}

@Override
public void onStatusChanged(String provider, int status, Bundle extras) {
Log.d("GetLocationService", "Status changed");
}
};

mLocationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
Log.d("GetLocationService", "Permissions not granted");
return;
}
mLocationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 5000, 1, mLocationListener);
mLocationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 5000, 1, mLocationListener);
}

private Notification createNotification(String title, String text, String ticker) {
NotificationManager notificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
String channelId = "location_service_channel";
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
NotificationChannel channel = new NotificationChannel(channelId, "Location Service", NotificationManager.IMPORTANCE_LOW);
notificationManager.createNotificationChannel(channel);
}
NotificationCompat.Builder builder = new NotificationCompat.Builder(this, channelId)
.setOngoing(true)
.setSmallIcon(android.R.drawable.ic_menu_mylocation)
.setPriority(PRIORITY_MIN)
.setCategory(NotificationCompat.CATEGORY_SERVICE)
.setTicker(ticker)
.setContentTitle(title)
.setContentText(text);
return builder.build();
}

@Override
public void onDestroy() {
mLocationManager.removeUpdates(mLocationListener);
wakeLock.release();
stopForeground(true);
super.onDestroy();
}
}


Подробнее здесь: https://stackoverflow.com/questions/787 ... andby-mode
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Android»