В моем приложении есть требование постоянно отправлять местоположение, даже если приложение находится в фоновом режиме или было закрыто.
Для этого у меня есть служба приоритетного плана, которая работает отлично, но когда устройство находится в режиме ожидания, обновления местоположения становятся реже, с интервалом до нескольких часов.
Вероятно, это связано с мерами энергосбережения ОС, но для этого случае использования, его нужно как-то переопределить.
Я пробовал использовать 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
Служба определения местоположения в режиме ожидания ⇐ Android
Форум для тех, кто программирует под Android
-
Anonymous
1721909281
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();
}
}
Подробнее здесь: [url]https://stackoverflow.com/questions/78793209/locationservie-in-staandby-mode[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия